Skip to content

Commit ff94889

Browse files
committed
Refactor FFI backend handling and improve build scripts
- Updated package.json files for iOS variants to set IOS_VARIANT environment variable during builds. - Modified NativeScriptNativeApi.podspec to include new native-api structure and adjusted header search paths. - Changed references from native-api-jsi to native-api in package.json and build scripts. - Enhanced build_metadata_generator.sh to include source hash verification for metadata generator. - Refined build_nativescript.sh to streamline FFI backend handling and ensure proper engine checks. - Updated check_ffi_boundaries.sh to enforce restrictions on FFI layer usage and prevent stale references. - Improved react_native_app_utils.sh to handle marker file content changes more effectively. - Adjusted run-tests-macos.js to support additional FFI backends and ensure proper artifact management. - Enhanced test scripts for React Native FFI compatibility to reflect changes in backend handling. - Updated NativeApiJsiTests.js to reflect the transition from direct to engine-based API bridging.
1 parent c27a2e0 commit ff94889

94 files changed

Lines changed: 45873 additions & 4288 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,4 @@ NativeScript/ffi/*/GeneratedSignatureDispatch.inc.stamp
7272
packages/react-native/dist/
7373
packages/react-native/ios/vendor/
7474
packages/react-native/metadata/
75-
packages/react-native/native-api-jsi/
75+
packages/react-native/native-api/

NativeScript/CMakeLists.txt

Lines changed: 71 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
2020
# Arguments
2121
set(TARGET_PLATFORM "macos" CACHE STRING "Target platform for the Objective-C bridge")
2222
set(TARGET_ENGINE "v8" CACHE STRING "Target JS engine for the NativeScript runtime")
23-
set(NS_FFI_BACKEND "auto" CACHE STRING "FFI backend: auto, napi, or direct")
23+
set(NS_FFI_BACKEND "auto" CACHE STRING "FFI backend: auto, napi, v8, jsc, quickjs, or hermes")
2424
set(NS_GSD_BACKEND "auto" CACHE STRING "Generated signature dispatch backend: auto, v8, jsc, quickjs, hermes, napi, or none")
2525
set(METADATA_SIZE 0 CACHE STRING "Size of embedded metadata in bytes")
2626
set(BUILD_CLI_BINARY OFF CACHE BOOL "Build the NativeScript CLI binary")
2727
set(BUILD_MACOS_NODE_API OFF CACHE BOOL "Build the NativeScript macOS Node API dylib")
28-
set_property(CACHE NS_FFI_BACKEND PROPERTY STRINGS auto napi direct)
28+
set_property(CACHE NS_FFI_BACKEND PROPERTY STRINGS auto napi v8 jsc quickjs hermes)
2929
set_property(CACHE NS_GSD_BACKEND PROPERTY STRINGS auto v8 jsc quickjs hermes napi none)
3030

3131
if (BUILD_MACOS_NODE_API)
@@ -139,29 +139,46 @@ message(STATUS "GENERIC_NAPI = ${GENERIC_NAPI}")
139139
if(NS_FFI_BACKEND STREQUAL "auto")
140140
if(GENERIC_NAPI OR TARGET_ENGINE_NONE)
141141
set(NS_EFFECTIVE_FFI_BACKEND "napi")
142-
elseif(TARGET_ENGINE_HERMES OR TARGET_ENGINE_V8 OR TARGET_ENGINE_JSC OR TARGET_ENGINE_QUICKJS)
143-
set(NS_EFFECTIVE_FFI_BACKEND "direct")
142+
elseif(TARGET_ENGINE_HERMES)
143+
set(NS_EFFECTIVE_FFI_BACKEND "hermes")
144+
elseif(TARGET_ENGINE_V8)
145+
set(NS_EFFECTIVE_FFI_BACKEND "v8")
146+
elseif(TARGET_ENGINE_JSC)
147+
set(NS_EFFECTIVE_FFI_BACKEND "jsc")
148+
elseif(TARGET_ENGINE_QUICKJS)
149+
set(NS_EFFECTIVE_FFI_BACKEND "quickjs")
144150
else()
145151
set(NS_EFFECTIVE_FFI_BACKEND "napi")
146152
endif()
147-
elseif(NS_FFI_BACKEND STREQUAL "napi" OR NS_FFI_BACKEND STREQUAL "direct")
153+
elseif(NS_FFI_BACKEND STREQUAL "napi" OR
154+
NS_FFI_BACKEND STREQUAL "v8" OR
155+
NS_FFI_BACKEND STREQUAL "jsc" OR
156+
NS_FFI_BACKEND STREQUAL "quickjs" OR
157+
NS_FFI_BACKEND STREQUAL "hermes")
148158
set(NS_EFFECTIVE_FFI_BACKEND "${NS_FFI_BACKEND}")
149159
else()
150160
message(FATAL_ERROR "Unknown NS_FFI_BACKEND: ${NS_FFI_BACKEND}")
151161
endif()
152162

153-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct" AND
163+
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
154164
(GENERIC_NAPI OR TARGET_ENGINE_NONE OR BUILD_MACOS_NODE_API))
155-
message(FATAL_ERROR "NS_FFI_BACKEND=direct requires an embedded JS runtime build")
165+
message(FATAL_ERROR
166+
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} requires an embedded JS runtime build")
167+
endif()
168+
169+
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
170+
NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "${TARGET_ENGINE}")
171+
message(FATAL_ERROR
172+
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} requires TARGET_ENGINE=${NS_EFFECTIVE_FFI_BACKEND}")
156173
endif()
157174

158175
message(STATUS "NS_FFI_BACKEND = ${NS_FFI_BACKEND} (${NS_EFFECTIVE_FFI_BACKEND})")
159176

160177
if(NS_GSD_BACKEND STREQUAL "auto")
161-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
162-
set(NS_EFFECTIVE_GSD_BACKEND "none")
163-
else()
178+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
164179
set(NS_EFFECTIVE_GSD_BACKEND "napi")
180+
else()
181+
set(NS_EFFECTIVE_GSD_BACKEND "${NS_EFFECTIVE_FFI_BACKEND}")
165182
endif()
166183
elseif(NS_GSD_BACKEND STREQUAL "v8" OR
167184
NS_GSD_BACKEND STREQUAL "jsc" OR
@@ -193,10 +210,10 @@ if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
193210
"NS_FFI_BACKEND=napi is the pure Node-API FFI backend and only supports "
194211
"NS_GSD_BACKEND=napi or none.")
195212
endif()
196-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct" AND
213+
if(NOT NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi" AND
197214
NS_EFFECTIVE_GSD_BACKEND STREQUAL "napi")
198215
message(FATAL_ERROR
199-
"NS_FFI_BACKEND=direct cannot use NS_GSD_BACKEND=napi. "
216+
"NS_FFI_BACKEND=${NS_EFFECTIVE_FFI_BACKEND} cannot use NS_GSD_BACKEND=napi. "
200217
"Use the matching engine backend or none.")
201218
endif()
202219

@@ -205,7 +222,6 @@ message(STATUS "NS_GSD_BACKEND = ${NS_GSD_BACKEND} (${NS_EFFECTIVE_GSD_BACKEND})
205222
# Set up sources
206223
include_directories(
207224
./
208-
ffi/shared
209225
../metadata-generator/include
210226
napi/common
211227
libffi/${LIBFFI_BUILD}/include
@@ -238,33 +254,33 @@ set(FFI_NAPI_SOURCE_FILES
238254
ffi/napi/ClassBuilder.mm
239255
)
240256

241-
set(FFI_DIRECT_SHARED_SOURCE_FILES
242-
ffi/direct/EmbeddedMetadata.mm
257+
set(FFI_ENGINE_SHARED_SOURCE_FILES
258+
ffi/shared/MetadataState.mm
243259
)
244260

245-
set(FFI_HERMES_DIRECT_SOURCE_FILES
246-
${FFI_DIRECT_SHARED_SOURCE_FILES}
261+
set(FFI_HERMES_ENGINE_SOURCE_FILES
262+
${FFI_ENGINE_SHARED_SOURCE_FILES}
247263
ffi/hermes/NativeApiJsi.mm
248264
)
249265

250-
set(FFI_V8_DIRECT_SOURCE_FILES
251-
${FFI_DIRECT_SHARED_SOURCE_FILES}
266+
set(FFI_V8_ENGINE_SOURCE_FILES
267+
${FFI_ENGINE_SHARED_SOURCE_FILES}
252268
ffi/v8/NativeApiV8.mm
253269
ffi/v8/NativeApiV8HostObjects.mm
254270
ffi/v8/NativeApiV8Runtime.mm
255271
ffi/v8/NativeApiV8Value.mm
256272
)
257273

258-
set(FFI_JSC_DIRECT_SOURCE_FILES
259-
${FFI_DIRECT_SHARED_SOURCE_FILES}
274+
set(FFI_JSC_ENGINE_SOURCE_FILES
275+
${FFI_ENGINE_SHARED_SOURCE_FILES}
260276
ffi/jsc/NativeApiJSC.mm
261277
ffi/jsc/NativeApiJSCHostObjects.mm
262278
ffi/jsc/NativeApiJSCRuntime.mm
263279
ffi/jsc/NativeApiJSCValue.mm
264280
)
265281

266-
set(FFI_QUICKJS_DIRECT_SOURCE_FILES
267-
${FFI_DIRECT_SHARED_SOURCE_FILES}
282+
set(FFI_QUICKJS_ENGINE_SOURCE_FILES
283+
${FFI_ENGINE_SHARED_SOURCE_FILES}
268284
ffi/quickjs/NativeApiQuickJSHostObjects.mm
269285
ffi/quickjs/NativeApiQuickJS.mm
270286
ffi/quickjs/NativeApiQuickJSRuntime.mm
@@ -327,10 +343,10 @@ if(ENABLE_JS_RUNTIME)
327343
napi/v8/SimpleAllocator.cpp
328344
)
329345

330-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
346+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "v8")
331347
set(SOURCE_FILES
332348
${SOURCE_FILES}
333-
${FFI_V8_DIRECT_SOURCE_FILES}
349+
${FFI_V8_ENGINE_SOURCE_FILES}
334350
)
335351
endif()
336352

@@ -358,10 +374,10 @@ if(ENABLE_JS_RUNTIME)
358374
napi/hermes/jsr.cpp
359375
)
360376

361-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
377+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "hermes")
362378
set(SOURCE_FILES
363379
${SOURCE_FILES}
364-
${FFI_HERMES_DIRECT_SOURCE_FILES}
380+
${FFI_HERMES_ENGINE_SOURCE_FILES}
365381
)
366382
endif()
367383

@@ -397,10 +413,10 @@ if(ENABLE_JS_RUNTIME)
397413
napi/quickjs/jsr.cpp
398414
)
399415

400-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
416+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "quickjs")
401417
set(SOURCE_FILES
402418
${SOURCE_FILES}
403-
${FFI_QUICKJS_DIRECT_SOURCE_FILES}
419+
${FFI_QUICKJS_ENGINE_SOURCE_FILES}
404420
)
405421
endif()
406422

@@ -416,10 +432,10 @@ if(ENABLE_JS_RUNTIME)
416432
napi/jsc/jsr.cpp
417433
)
418434

419-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
435+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "jsc")
420436
set(SOURCE_FILES
421437
${SOURCE_FILES}
422-
${FFI_JSC_DIRECT_SOURCE_FILES}
438+
${FFI_JSC_ENGINE_SOURCE_FILES}
423439
)
424440
endif()
425441

@@ -510,58 +526,48 @@ elseif(TARGET_ENGINE_JSC)
510526
target_compile_definitions(${NAME} PRIVATE TARGET_ENGINE_JSC)
511527
endif()
512528

513-
set(NS_GSD_BACKEND_V8_VALUE 0)
514-
set(NS_GSD_BACKEND_JSC_VALUE 0)
515-
set(NS_GSD_BACKEND_QUICKJS_VALUE 0)
516529
set(NS_GSD_BACKEND_HERMES_VALUE 0)
517530
set(NS_GSD_BACKEND_NAPI_VALUE 0)
518-
set(NS_GSD_BACKEND_ENGINE_DIRECT_VALUE 0)
519-
set(NS_GSD_BACKEND_DIRECT_PREPARED_VALUE 0)
520-
set(NS_FFI_BACKEND_DIRECT_VALUE 0)
531+
set(NS_GSD_BACKEND_PREPARED_VALUE 0)
521532
set(NS_FFI_BACKEND_NAPI_VALUE 0)
533+
set(NS_FFI_BACKEND_V8_VALUE 0)
534+
set(NS_FFI_BACKEND_JSC_VALUE 0)
535+
set(NS_FFI_BACKEND_QUICKJS_VALUE 0)
536+
set(NS_FFI_BACKEND_HERMES_VALUE 0)
522537

523538
if(NS_EFFECTIVE_GSD_BACKEND STREQUAL "v8")
524-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
525-
set(NS_GSD_BACKEND_DIRECT_PREPARED_VALUE 1)
526-
else()
527-
set(NS_GSD_BACKEND_V8_VALUE 1)
528-
endif()
539+
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
529540
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "jsc")
530-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
531-
set(NS_GSD_BACKEND_DIRECT_PREPARED_VALUE 1)
532-
else()
533-
set(NS_GSD_BACKEND_JSC_VALUE 1)
534-
set(NS_GSD_BACKEND_ENGINE_DIRECT_VALUE 1)
535-
endif()
541+
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
536542
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "quickjs")
537-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
538-
set(NS_GSD_BACKEND_DIRECT_PREPARED_VALUE 1)
539-
else()
540-
set(NS_GSD_BACKEND_QUICKJS_VALUE 1)
541-
set(NS_GSD_BACKEND_ENGINE_DIRECT_VALUE 1)
542-
endif()
543+
set(NS_GSD_BACKEND_PREPARED_VALUE 1)
543544
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "hermes")
544545
set(NS_GSD_BACKEND_HERMES_VALUE 1)
545546
elseif(NS_EFFECTIVE_GSD_BACKEND STREQUAL "napi")
546547
set(NS_GSD_BACKEND_NAPI_VALUE 1)
547548
endif()
548549

549-
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "direct")
550-
set(NS_FFI_BACKEND_DIRECT_VALUE 1)
551-
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
550+
if(NS_EFFECTIVE_FFI_BACKEND STREQUAL "napi")
552551
set(NS_FFI_BACKEND_NAPI_VALUE 1)
552+
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "v8")
553+
set(NS_FFI_BACKEND_V8_VALUE 1)
554+
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "jsc")
555+
set(NS_FFI_BACKEND_JSC_VALUE 1)
556+
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "quickjs")
557+
set(NS_FFI_BACKEND_QUICKJS_VALUE 1)
558+
elseif(NS_EFFECTIVE_FFI_BACKEND STREQUAL "hermes")
559+
set(NS_FFI_BACKEND_HERMES_VALUE 1)
553560
endif()
554561

555562
target_compile_definitions(${NAME} PRIVATE
556-
NS_GSD_BACKEND_V8=${NS_GSD_BACKEND_V8_VALUE}
557-
NS_GSD_BACKEND_JSC=${NS_GSD_BACKEND_JSC_VALUE}
558-
NS_GSD_BACKEND_QUICKJS=${NS_GSD_BACKEND_QUICKJS_VALUE}
559563
NS_GSD_BACKEND_HERMES=${NS_GSD_BACKEND_HERMES_VALUE}
560564
NS_GSD_BACKEND_NAPI=${NS_GSD_BACKEND_NAPI_VALUE}
561-
NS_GSD_BACKEND_ENGINE_DIRECT=${NS_GSD_BACKEND_ENGINE_DIRECT_VALUE}
562-
NS_GSD_BACKEND_DIRECT_PREPARED=${NS_GSD_BACKEND_DIRECT_PREPARED_VALUE}
563-
NS_FFI_BACKEND_DIRECT=${NS_FFI_BACKEND_DIRECT_VALUE}
565+
NS_GSD_BACKEND_PREPARED=${NS_GSD_BACKEND_PREPARED_VALUE}
564566
NS_FFI_BACKEND_NAPI=${NS_FFI_BACKEND_NAPI_VALUE}
567+
NS_FFI_BACKEND_V8=${NS_FFI_BACKEND_V8_VALUE}
568+
NS_FFI_BACKEND_JSC=${NS_FFI_BACKEND_JSC_VALUE}
569+
NS_FFI_BACKEND_QUICKJS=${NS_FFI_BACKEND_QUICKJS_VALUE}
570+
NS_FFI_BACKEND_HERMES=${NS_FFI_BACKEND_HERMES_VALUE}
565571
)
566572

567573
set(FRAMEWORK_VERSION_VALUE "${VERSION}")
@@ -674,13 +680,13 @@ if(TARGET_ENGINE_V8)
674680
# Prefer universal sim slice if present
675681
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework")
676682
if(NOT EXISTS "${V8_SLICE_DIR}")
677-
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework") # fallback
683+
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64-simulator/libv8_monolith.framework")
678684
endif()
679685
elseif(TARGET_PLATFORM STREQUAL "ios")
680686
# Prefer universal sim slice if present
681687
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework")
682688
if(NOT EXISTS "${V8_SLICE_DIR}")
683-
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework") # fallback
689+
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/ios-arm64/libv8_monolith.framework")
684690
endif()
685691
elseif(TARGET_PLATFORM STREQUAL "visionos-sim")
686692
set(V8_SLICE_DIR "${V8_XCFRAMEWORK}/xrsimulator-arm64/libv8_monolith.framework")

0 commit comments

Comments
 (0)