Skip to content

Commit 99ec371

Browse files
LaszloLangoyichoi
authored andcommitted
Implementation of basics of N-API for building native addons. (#1848)
N-API Reference: https://nodejs.org/docs/latest-v10.x/api/n-api.html Implemented features: * Basic N-API data Types * Error handling * Object lifetime management * Functions for create, convert and compare JS values * Functions to work with JavaScript properties * Object wrapping Missing features: * ES2015 features (Symbol, TypedArrays, ArrayBuffer, Promise, etc.) * Asynchronous Operations and Thread-safe Function Calls * Implementation of 'napi_external' type Based on previous work of Rokid Co., Ltd. (https://github.com/yodaos-project/ShadowNode) Co-authors: Daniel Balla <[email protected]> and Istvan Miklos <[email protected]> IoT.js-DCO-1.0-Signed-off-by: László Langó [email protected]
1 parent 524f84f commit 99ec371

Some content is hidden

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

68 files changed

+5518
-164
lines changed

.travis.yml

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ matrix:
1818
env:
1919
- OPTS="mock-linux"
2020

21+
- name: "Linux/x86-64 Build with N-API support & Correctness Tests"
22+
env:
23+
- OPTS="n-api"
24+
install:
25+
- npm install
26+
2127
- name: "Raspberry Pi 2 Build Test"
2228
env:
2329
- OPTS="rpi2"

cmake/iotjs.cmake

+73-40
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,10 @@ if(ENABLE_SNAPSHOT)
356356
iotjs_add_compile_flags(-DENABLE_SNAPSHOT)
357357
endif()
358358

359+
if (EXPOSE_GC)
360+
iotjs_add_compile_flags(-DEXPOSE_GC)
361+
endif()
362+
359363
# Run js2c
360364
set(JS2C_RUN_MODE "release")
361365
if("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
@@ -456,6 +460,7 @@ message(STATUS "CMAKE_C_FLAGS ${CMAKE_C_FLAGS}")
456460
message(STATUS "CMAKE_TOOLCHAIN_FILE ${CMAKE_TOOLCHAIN_FILE}")
457461
message(STATUS "ENABLE_LTO ${ENABLE_LTO}")
458462
message(STATUS "ENABLE_SNAPSHOT ${ENABLE_SNAPSHOT}")
463+
message(STATUS "EXPOSE_GC ${EXPOSE_GC}")
459464
message(STATUS "EXTERNAL_INCLUDE_DIR ${EXTERNAL_INCLUDE_DIR}")
460465
message(STATUS "EXTERNAL_LIBC_INTERFACE ${EXTERNAL_LIBC_INTERFACE}")
461466
message(STATUS "EXTERNAL_LIBS ${EXTERNAL_LIBS}")
@@ -472,19 +477,64 @@ message(STATUS "TARGET_OS ${TARGET_OS}")
472477
message(STATUS "TARGET_SYSTEMROOT ${TARGET_SYSTEMROOT}")
473478

474479
iotjs_add_compile_flags(${IOTJS_MODULE_DEFINES})
480+
475481
if(FEATURE_DEBUGGER)
476482
iotjs_add_compile_flags("-DJERRY_DEBUGGER")
477483
endif()
478484

479-
# Configure the libiotjs.a
480-
set(TARGET_STATIC_IOTJS libiotjs)
481-
add_library(${TARGET_STATIC_IOTJS} STATIC ${LIB_IOTJS_SRC})
482-
set_target_properties(${TARGET_STATIC_IOTJS} PROPERTIES
485+
file(GLOB IOTJS_HEADERS "${ROOT_DIR}/src/*.h")
486+
file(GLOB JERRY_HEADERS "${ROOT_DIR}/deps/jerry/jerry-core/include/*.h")
487+
file(GLOB LIBUV_HEADERS "${ROOT_DIR}/deps/libtuv/include/*.h")
488+
489+
set(IOTJS_PUBLIC_HEADERS
490+
"include/iotjs.h"
491+
"include/node_api.h"
492+
"include/node_api_types.h"
493+
${IOTJS_HEADERS}
494+
${JERRY_HEADERS}
495+
${LIBUV_HEADERS}
496+
)
497+
498+
# Configure the libiotjs
499+
set(TARGET_LIB_IOTJS libiotjs)
500+
if(CREATE_SHARED_LIB)
501+
add_library(${TARGET_LIB_IOTJS} SHARED ${LIB_IOTJS_SRC})
502+
else()
503+
add_library(${TARGET_LIB_IOTJS} STATIC ${LIB_IOTJS_SRC})
504+
505+
# FIXME: module specific condition should not be in the main cmake
506+
if(${ENABLE_MODULE_NAPI})
507+
# Force symbols to be entered in the output file as undefined symbols.
508+
file(READ "${IOTJS_SOURCE_DIR}/napi/node_symbols.txt" NODE_SYMBOLS)
509+
string(REGEX REPLACE "[\r|\n]" ";" NODE_SYMBOLS "${NODE_SYMBOLS}")
510+
set(NODE_SYMBOLS_LINK_FLAGS "-Wl")
511+
# Some tests require the GC to be exposed
512+
iotjs_add_compile_flags(-DEXPOSE_GC)
513+
foreach(NODE_SYMBOL ${NODE_SYMBOLS})
514+
set(NODE_SYMBOLS_LINK_FLAGS
515+
"${NODE_SYMBOLS_LINK_FLAGS},-u,${NODE_SYMBOL}")
516+
endforeach()
517+
iotjs_add_link_flags(${NODE_SYMBOLS_LINK_FLAGS})
518+
endif()
519+
endif(CREATE_SHARED_LIB)
520+
521+
add_dependencies(${TARGET_LIB_IOTJS}
522+
${JERRY_LIBS}
523+
${TUV_LIBS}
524+
libhttp-parser
525+
${MBEDTLS_LIBS}
526+
)
527+
528+
set_target_properties(${TARGET_LIB_IOTJS} PROPERTIES
483529
OUTPUT_NAME iotjs
484530
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
531+
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
532+
PUBLIC_HEADER "${IOTJS_PUBLIC_HEADERS}"
485533
)
486-
target_include_directories(${TARGET_STATIC_IOTJS} PRIVATE ${IOTJS_INCLUDE_DIRS})
487-
target_link_libraries(${TARGET_STATIC_IOTJS}
534+
target_include_directories(${TARGET_LIB_IOTJS}
535+
PRIVATE ${IOTJS_INCLUDE_DIRS})
536+
target_link_libraries(${TARGET_LIB_IOTJS}
537+
${CMAKE_DL_LIBS}
488538
${JERRY_LIBS}
489539
${TUV_LIBS}
490540
libhttp-parser
@@ -500,47 +550,30 @@ if("${BIN_INSTALL_DIR}" STREQUAL "")
500550
set(BIN_INSTALL_DIR "bin")
501551
endif()
502552

503-
install(TARGETS ${TARGET_STATIC_IOTJS} DESTINATION ${LIB_INSTALL_DIR})
504-
505-
# Install headers
506-
if("${INCLUDE_INSTALL_DIR}" STREQUAL "")
507-
set(INCLUDE_INSTALL_DIR "include/iotjs")
508-
endif()
509-
file(GLOB IOTJS_HEADERS include/*.h)
510-
install(FILES ${IOTJS_HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR})
511-
512-
# Configure the libiotjs.so
513-
if (NOT BUILD_LIB_ONLY AND CREATE_SHARED_LIB)
514-
set(TARGET_SHARED_IOTJS shared_iotjs)
515-
add_library(${TARGET_SHARED_IOTJS} SHARED)
516-
set_target_properties(${TARGET_SHARED_IOTJS} PROPERTIES
517-
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib"
518-
LIBRARY_OUTPUT_NAME iotjs
519-
LINKER_LANGUAGE C
520-
)
521-
target_link_libraries(${TARGET_SHARED_IOTJS}
522-
-Wl,--whole-archive
523-
${TARGET_STATIC_IOTJS}
524-
${JERRY_LIBS}
525-
${TUV_LIBS}
526-
libhttp-parser
527-
${MBEDTLS_LIBS}
528-
-Wl,--no-whole-archive
529-
${EXTERNAL_LIBS})
530-
install(TARGETS ${TARGET_SHARED_IOTJS} DESTINATION ${LIB_INSTALL_DIR})
531-
endif()
532-
533553
# Configure the iotjs executable
534554
if(NOT BUILD_LIB_ONLY)
535555
set(TARGET_IOTJS iotjs)
556+
message(STATUS "CMAKE_BINARY_DIR ${CMAKE_BINARY_DIR}")
557+
message(STATUS "BINARY_INSTALL_DIR ${INSTALL_PREFIX}/bin")
558+
message(STATUS "LIBRARY_INSTALL_DIR ${INSTALL_PREFIX}/lib")
559+
536560
add_executable(${TARGET_IOTJS} ${ROOT_DIR}/src/platform/linux/iotjs_linux.c)
537561
set_target_properties(${TARGET_IOTJS} PROPERTIES
538562
LINK_FLAGS "${IOTJS_LINKER_FLAGS}"
539563
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
540564
)
541565
target_include_directories(${TARGET_IOTJS} PRIVATE ${IOTJS_INCLUDE_DIRS})
542-
target_link_libraries(${TARGET_IOTJS} ${TARGET_STATIC_IOTJS})
543-
install(TARGETS ${TARGET_IOTJS} DESTINATION ${BIN_INSTALL_DIR})
544-
545-
add_subdirectory(test)
566+
target_link_libraries(${TARGET_IOTJS} ${TARGET_LIB_IOTJS})
567+
install(TARGETS ${TARGET_IOTJS}
568+
RUNTIME DESTINATION "${INSTALL_PREFIX}/bin"
569+
LIBRARY DESTINATION "${INSTALL_PREFIX}/lib"
570+
PUBLIC_HEADER DESTINATION "${INSTALL_PREFIX}/include/iotjs")
571+
if(CREATE_SHARED_LIB)
572+
install(TARGETS ${TARGET_LIB_IOTJS}
573+
RUNTIME DESTINATION "${INSTALL_PREFIX}/bin"
574+
LIBRARY DESTINATION "${INSTALL_PREFIX}/lib"
575+
PUBLIC_HEADER DESTINATION "${INSTALL_PREFIX}/include/iotjs")
576+
endif()
577+
else()
578+
install(TARGETS ${TARGET_LIB_IOTJS} DESTINATION ${LIB_INSTALL_DIR})
546579
endif()

0 commit comments

Comments
 (0)