Skip to content

Commit e4d2ce4

Browse files
committed
feat: node-api based runtime
1 parent d4f3b68 commit e4d2ce4

File tree

918 files changed

+306674
-40710
lines changed

Some content is hidden

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

918 files changed

+306674
-40710
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ Thumbs.db
4141
node_modules/
4242
package-lock.json
4343
*.pyc
44-
v8
4544
v8_build
4645
.npmrc
46+
/Frameworks/
4747

4848
/llvm/
4949

NativeScript/CMakeLists.txt

Lines changed: 305 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,305 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
3+
# Metadata
4+
5+
project(NativeScript)
6+
7+
set(NAME NativeScript)
8+
set(VERSION 0.1.0)
9+
set(BUNDLE_IDENTIFIER "org.nativescript.runtime")
10+
11+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fobjective-c")
12+
13+
set(CMAKE_CXX_STANDARD 20)
14+
15+
set(BUILD_FRAMEWORK TRUE)
16+
17+
# Arguments
18+
19+
set(TARGET_PLATFORM "macos" CACHE STRING "Target platform for the Objective-C bridge")
20+
set(TARGET_ENGINE "hermes" CACHE STRING "Target JS engine for the NativeScript runtime")
21+
set(METADATA_SIZE 0 CACHE STRING "Size of embedded metadata in bytes")
22+
23+
if(TARGET_PLATFORM STREQUAL "ios")
24+
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "13.0")
25+
set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
26+
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
27+
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0")
28+
set(LIBFFI_BUILD "iphoneos-arm64")
29+
set(TARGET_PLATFORM_IOS TRUE)
30+
set(SDK_NAME "iphoneos")
31+
set(CMAKE_OSX_ARCHITECTURES "arm64")
32+
set(TARGET_PLATFORM_SPEC "ios-arm64")
33+
elseif(TARGET_PLATFORM STREQUAL "ios-sim")
34+
set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "13.0")
35+
set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2")
36+
set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
37+
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0")
38+
set(LIBFFI_BUILD "iphonesimulator-universal")
39+
set(TARGET_PLATFORM_IOS TRUE)
40+
set(TARGET_PLATFORM_SIM TRUE)
41+
set(SDK_NAME "iphonesimulator")
42+
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
43+
set(TARGET_PLATFORM_SPEC "ios-arm64_x86_64-simulator")
44+
elseif(TARGET_PLATFORM STREQUAL "macos")
45+
set(CMAKE_XCODE_ATTRIBUTE_MACOSX_DEPLOYMENT_TARGET "13.0")
46+
set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0")
47+
set(LIBFFI_BUILD "macosx-universal")
48+
set(TARGET_PLATFORM_MACOS TRUE)
49+
set(SDK_NAME "macosx")
50+
set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64")
51+
set(TARGET_PLATFORM_SPEC "macos-arm64_x86_64")
52+
else()
53+
message(FATAL_ERROR "Unknown target platform: ${TARGET_PLATFORM}")
54+
return()
55+
endif()
56+
57+
set(ENABLE_JS_RUNTIME TRUE)
58+
59+
if (TARGET_ENGINE STREQUAL "none")
60+
unset(ENABLE_JS_RUNTIME)
61+
set(TARGET_ENGINE_NONE TRUE)
62+
elseif (TARGET_ENGINE STREQUAL "hermes")
63+
set(TARGET_ENGINE_HERMES TRUE)
64+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -std=c++20 -DTARGET_ENGINE_HERMES")
65+
elseif (TARGET_ENGINE STREQUAL "v8")
66+
set(TARGET_ENGINE_V8 TRUE)
67+
add_link_options("-fuse-ld=/opt/homebrew/opt/llvm/bin/ld64.lld")
68+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -stdlib=libc++ -std=c++20 -DV8_COMPRESS_POINTERS -DV8_ENABLE_SANDBOX -DTARGET_ENGINE_V8")
69+
else()
70+
message(FATAL_ERROR "Unknown target engine: ${TARGET_ENGINE}")
71+
return()
72+
endif()
73+
74+
if (ENABLE_JS_RUNTIME)
75+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DENABLE_JS_RUNTIME")
76+
elseif (TARGET_PLATFORM_MACOS)
77+
# If building a generic library for macOS, we'll build a dylib instead of a framework
78+
unset(BUILD_FRAMEWORK)
79+
set(GENERIC_NAPI TRUE)
80+
endif()
81+
82+
message(STATUS "TARGET_PLATFORM = ${TARGET_PLATFORM}")
83+
message(STATUS "TARGET_ENGINE = ${TARGET_ENGINE}")
84+
message(STATUS "ENABLE_JS_RUNTIME = ${ENABLE_JS_RUNTIME}")
85+
86+
# Find SDK
87+
88+
find_program(XCODEBUILD_EXECUTABLE xcodebuild)
89+
90+
if(METADATA_SIZE EQUAL 0)
91+
unset(METADATA_SIZE)
92+
else()
93+
message(STATUS "EMBED_METADATA_SIZE = ${METADATA_SIZE}"
94+
" (metadata will be embedded in the library)")
95+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DEMBED_METADATA_SIZE=${METADATA_SIZE}")
96+
endif()
97+
98+
message(STATUS "TARGET_PLATFORM = ${TARGET_PLATFORM}")
99+
100+
execute_process(
101+
COMMAND ${XCODEBUILD_EXECUTABLE} -version -sdk ${SDK_NAME} Path
102+
OUTPUT_VARIABLE CMAKE_OSX_SYSROOT_INT
103+
ERROR_QUIET
104+
OUTPUT_STRIP_TRAILING_WHITESPACE
105+
)
106+
107+
set(CMAKE_OSX_SYSROOT_INT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "")
108+
set(CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT_INT}" CACHE INTERNAL "")
109+
110+
message(STATUS "SDK = ${CMAKE_OSX_SYSROOT}")
111+
112+
# Set up sources
113+
114+
include_directories(
115+
./
116+
../metadata-generator/include
117+
ada
118+
napi/common
119+
libffi/${LIBFFI_BUILD}/include
120+
/Library/Developer/CommandLineTools/usr/include
121+
)
122+
123+
if (TARGET_ENGINE_V8)
124+
include_directories(
125+
napi/v8
126+
napi/v8/include
127+
napi/v8/v8_inspector
128+
)
129+
elseif(TARGET_ENGINE_HERMES)
130+
include_directories(
131+
napi/hermes
132+
napi/hermes/hermes
133+
napi/hermes/jsi
134+
)
135+
elseif(TARGET_ENGINE_NONE)
136+
include_directories(
137+
napi/generic
138+
)
139+
endif()
140+
141+
set(LIB_SOURCE_FILES
142+
ffi/AutoreleasePool.mm
143+
ffi/Protocol.mm
144+
ffi/ObjCBridge.mm
145+
ffi/Block.mm
146+
ffi/Class.mm
147+
ffi/Closure.mm
148+
ffi/ClassMember.mm
149+
ffi/Cif.mm
150+
ffi/TypeConv.mm
151+
ffi/Util.mm
152+
ffi/Struct.mm
153+
ffi/ObjectRef.mm
154+
ffi/JSObject.mm
155+
ffi/Enum.mm
156+
ffi/Variable.mm
157+
ffi/Object.mm
158+
ffi/CFunction.mm
159+
ffi/Interop.mm
160+
ffi/InlineFunctions.mm
161+
ffi/ClassBuilder.mm
162+
)
163+
164+
if (ENABLE_JS_RUNTIME)
165+
set(LIB_SOURCE_FILES
166+
${LIB_SOURCE_FILES}
167+
runtime/Console.cpp
168+
runtime/Runtime.cpp
169+
runtime/Require.cpp
170+
runtime/Performance.cpp
171+
runtime/Bundle.mm
172+
runtime/Timers.mm
173+
runtime/App.mm
174+
runtime/NativeScript.mm
175+
runtime/RuntimeConfig.cpp
176+
)
177+
178+
if (TARGET_ENGINE_V8)
179+
set(LIB_SOURCE_FILES
180+
${LIB_SOURCE_FILES}
181+
napi/v8/v8-api.cpp
182+
napi/v8/jsr.cpp
183+
napi/v8/SimpleAllocator.cpp
184+
)
185+
elseif(TARGET_ENGINE_HERMES)
186+
set(LIB_SOURCE_FILES
187+
${LIB_SOURCE_FILES}
188+
napi/hermes/jsr.cpp
189+
)
190+
endif()
191+
endif()
192+
193+
# Build targets
194+
195+
add_library(
196+
${NAME}
197+
SHARED
198+
${LIB_SOURCE_FILES}
199+
)
200+
201+
target_sources(
202+
${NAME}
203+
PRIVATE
204+
"NativeScript.h"
205+
)
206+
207+
set_target_properties(${NAME} PROPERTIES
208+
VERSION ${VERSION}
209+
SOVERSION ${VERSION}
210+
FRAMEWORK_VERSION ${VERSION}
211+
MACOSX_FRAMEWORK_SHORT_VERSION_STRING ${VERSION}
212+
MACOSX_FRAMEWORK_BUNDLE_VERSION ${VERSION}
213+
MACOSX_FRAMEWORK_IDENTIFIER org.nativescript.runtime
214+
PUBLIC_HEADER "NativeScript.h"
215+
)
216+
217+
if (BUILD_FRAMEWORK)
218+
message(STATUS "FRAMEWORK = TRUE")
219+
set_target_properties(${NAME} PROPERTIES
220+
FRAMEWORK TRUE
221+
)
222+
endif()
223+
224+
if(TARGET_PLATFORM_MACOS)
225+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTARGET_PLATFORM_MACOS")
226+
227+
# add_custom_command(TARGET ${NAME} POST_BUILD
228+
# COMMAND /usr/libexec/PlistBuddy -c "Add :LSMinimumSystemVersion string ${CMAKE_OSX_DEPLOYMENT_TARGET}" $<TARGET_FILE_DIR:${NAME}>/Resources/Info.plist
229+
# )
230+
231+
set(METADATA_FILE "metadata.macos.nsmd")
232+
elseif(TARGET_PLATFORM_IOS)
233+
set(METADATA_FILE "metadata.ios.nsmd")
234+
endif()
235+
236+
if(NOT METADATA_SIZE EQUAL 0)
237+
message(STATUS "Running script to embed metadata in the library")
238+
239+
add_custom_command(TARGET ${NAME} POST_BUILD
240+
COMMAND codesign --remove-signature $<TARGET_FILE:${NAME}>
241+
)
242+
243+
add_custom_command(TARGET ${NAME} POST_BUILD
244+
COMMAND deno run -A ${CMAKE_CURRENT_SOURCE_DIR}/../scripts/write_metadata.ts $<TARGET_FILE:${NAME}> ${METADATA_FILE}
245+
)
246+
247+
add_custom_command(TARGET ${NAME} POST_BUILD
248+
COMMAND codesign -fs - $<TARGET_FILE:${NAME}>
249+
)
250+
endif()
251+
252+
message(STATUS "LIBFFI_BUILD = ${LIBFFI_BUILD}")
253+
254+
target_link_directories(
255+
${NAME}
256+
PRIVATE
257+
${CMAKE_CURRENT_SOURCE_DIR}/libffi/${LIBFFI_BUILD}
258+
)
259+
260+
if (TARGET_ENGINE_HERMES)
261+
target_link_options(
262+
${NAME}
263+
PRIVATE
264+
-Wl,-rpath,@executable_path/../Frameworks
265+
-Wl,-rpath,${CMAKE_CURRENT_SOURCE_DIR}/../Frameworks/hermes.xcframework/${TARGET_PLATFORM_SPEC}
266+
-Wl,-F${CMAKE_CURRENT_SOURCE_DIR}/../Frameworks/hermes.xcframework/${TARGET_PLATFORM_SPEC}
267+
)
268+
269+
target_link_libraries(
270+
${NAME}
271+
PRIVATE
272+
"-framework hermes"
273+
)
274+
endif()
275+
276+
target_link_libraries(
277+
${NAME}
278+
PRIVATE
279+
ffi
280+
"-framework Foundation"
281+
)
282+
283+
if(TARGET_PLATFORM_MACOS)
284+
target_link_libraries(
285+
${NAME}
286+
PRIVATE
287+
"-framework AppKit"
288+
)
289+
elseif(TARGET_PLATFORM_IOS)
290+
target_link_libraries(
291+
${NAME}
292+
PRIVATE
293+
"-framework UIKit"
294+
)
295+
endif()
296+
297+
# if (GENERIC_NAPI)
298+
target_link_options(
299+
${NAME}
300+
PRIVATE
301+
"-Wl"
302+
"-undefined"
303+
"dynamic_lookup"
304+
)
305+
# endif()

NativeScript/Info.plist

Lines changed: 0 additions & 22 deletions
This file was deleted.

NativeScript/JSIRuntime.h

Lines changed: 0 additions & 16 deletions
This file was deleted.

NativeScript/JSIRuntime.m

Lines changed: 0 additions & 21 deletions
This file was deleted.

0 commit comments

Comments
 (0)