Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .github/workflows/es-actions.yml
Original file line number Diff line number Diff line change
Expand Up @@ -660,8 +660,11 @@ jobs:
submodules: true
- name: Install Packages
run: |
# for i386 ICU (x86 cctest needs 32-bit ICU at runtime via dlopen)
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install -y ninja-build gcc-multilib g++-multilib
sudo apt-get install -y libicu-dev libicu-dev:i386
- name: Build x86/x64
env:
BUILD_OPTIONS_X86: -DCMAKE_SYSTEM_NAME=Linux -DCMAKE_SYSTEM_PROCESSOR=x86 -DESCARGOT_MODE=debug -DESCARGOT_THREADING=ON -DESCARGOT_DEBUGGER=1 -DESCARGOT_USE_EXTENDED_API=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=cctest -GNinja
Expand All @@ -676,6 +679,44 @@ jobs:
$RUNNER --arch=x86 --engine="$GITHUB_WORKSPACE/out/cctest/x86/cctest" cctest
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/cctest/x64/cctest" cctest

# Separate from build-test-api: N-API support is an early PoC
# gated behind ESCARGOT_NAPI, and test/napi-tc is a sparse checkout of the
# nodejs/node monorepo (submodule.test/napi-tc.update=none in .gitmodules
# keeps every OTHER job's plain `submodules: true` from fetching it in full).
build-test-napi:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Sparse checkout napi test corpus
run: |
NAPI_TC_SHA=$(git ls-tree HEAD test/napi-tc | awk '{print $3}')
if [ -z "$NAPI_TC_SHA" ]; then
echo "::error::test/napi-tc gitlink not found in HEAD tree." >&2
echo "::error::Ensure the submodule gitlink is committed (git add test/napi-tc && git commit)." >&2
exit 1
fi
rm -rf test/napi-tc
git clone --filter=blob:none --no-checkout https://github.com/nodejs/node.git test/napi-tc
cd test/napi-tc
git sparse-checkout init --no-cone
git sparse-checkout set test/js-native-api test/node-api test/common src/js_native_api.h src/node_api.h src/js_native_api_types.h src/node_api_types.h
git checkout "$NAPI_TC_SHA"
- name: Install Packages
run: |
sudo apt-get update
sudo apt-get install -y ninja-build libuv1-dev libicu-dev
- name: Build
env:
BUILD_OPTIONS: -DESCARGOT_MODE=debug -DESCARGOT_THREADING=1 -DESCARGOT_DEBUGGER=1 -DESCARGOT_USE_EXTENDED_API=ON -DESCARGOT_TEST=ON -DESCARGOT_OUTPUT=cctest -DESCARGOT_NAPI=ON -GNinja
run: |
cmake -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -H. -Bout/cctest/napi $BUILD_OPTIONS
ninja -Cout/cctest/napi
- name: Run Test
run: |
$RUNNER --arch=x86_64 --engine="$GITHUB_WORKSPACE/out/cctest/napi/cctest" cctest

build-test-codecache:
runs-on: ubuntu-latest
steps:
Expand Down
11 changes: 11 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -33,3 +33,14 @@
[submodule "samples/rtos/freertos/FreeRTOS-Kernel"]
path = samples/rtos/freertos/FreeRTOS-Kernel
url = https://github.com/FreeRTOS/FreeRTOS-Kernel.git
[submodule "test/napi-tc"]
path = test/napi-tc
url = https://github.com/nodejs/node.git
ignore = untracked
shallow = true
# this points at the nodejs/node monorepo; a plain `submodule update`
# would check out its ENTIRE tree (large). `update = none` makes
# generic `git submodule update --init [--recursive]` (what every other
# CI job's `submodules: true` checkout runs) skip it automatically.
# Only fetch it deliberately with a sparse checkout.
update = none
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -101,4 +101,5 @@ MESSAGE(STATUS "ESCARGOT_EXPORT_ALL: " ${ESCARGOT_EXPORT_ALL})
MESSAGE(STATUS "ESCARGOT_TCO: " ${ESCARGOT_TCO})
MESSAGE(STATUS "ESCARGOT_TEMPORAL: " ${ESCARGOT_TEMPORAL})
MESSAGE(STATUS "ESCARGOT_SHADOWREALM: " ${ESCARGOT_SHADOWREALM})
MESSAGE(STATUS "ESCARGOT_NAPI: " ${ESCARGOT_NAPI})
MESSAGE(STATUS "ESCARGOT_TEST: " ${ESCARGOT_TEST})
35 changes: 34 additions & 1 deletion build/config.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ SET (CFLAGS_FROM_ENV ${CFLAGS_FROM_ENV} ${ESCARGOT_CFLAGS_FROM_EXTERNAL})
SET (LDFLAGS_FROM_ENV ${LDFLAGS_FROM_ENV} ${ESCARGOT_LDFLAGS_FROM_EXTERNAL})

# ESCARGOT COMMON LDFLAGS
SET (ESCARGOT_LDFLAGS ${ESCARGOT_LDFLAGS} -fvisibility=hidden)
# Note: -fvisibility=hidden is set in target.cmake for the compiler

# bdwgc
IF (${ESCARGOT_MODE} STREQUAL "debug")
Expand Down Expand Up @@ -127,6 +127,12 @@ IF (ESCARGOT_LIBICU_SUPPORT)
ENDIF()
ENDIF()

# napi_define_class needs FunctionTemplateRef, which is gated behind
# ENABLE_EXTENDED_API; default it on for NAPI unless the caller already chose
IF (ESCARGOT_NAPI AND NOT DEFINED ESCARGOT_USE_EXTENDED_API)
SET (ESCARGOT_USE_EXTENDED_API ON)
ENDIF()

IF (ESCARGOT_USE_EXTENDED_API)
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DENABLE_EXTENDED_API)
ENDIF()
Expand Down Expand Up @@ -188,6 +194,33 @@ IF (ESCARGOT_SHADOWREALM)
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DENABLE_SHADOWREALM)
ENDIF()

IF (ESCARGOT_NAPI)
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DENABLE_NAPI)
# Target Node-API version 10: unlocks the additive v9/v10 declarations
# (node_api_create_syntax_error, property-key/external-string helpers, ...)
# in the vendored headers, which otherwise default to NAPI_VERSION 8. Also
# what napi_get_version reports.
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DNAPI_VERSION=10)
SET (ESCARGOT_INCDIRS ${ESCARGOT_INCDIRS} ${ESCARGOT_ROOT}/test/napi-tc/src)
SET (ESCARGOT_LIBRARIES ${ESCARGOT_LIBRARIES} dl)
# napi_* symbols live in this binary itself; addons are dlopen()'d with
# unresolved napi_* references (same as real Node, which also needs
# -rdynamic on its own executable for the same reason). Each napi_*
# definition carries its own default-visibility attribute (see
# ESCARGOT_NAPI_EXPORT in NapiTypes.h) instead of overriding
# -fvisibility=hidden for the whole binary.
SET (ESCARGOT_LDFLAGS ${ESCARGOT_LDFLAGS} -rdynamic)

# async_work/threadsafe_function (NapiAsyncWork.cpp) and
# napi_get_uv_event_loop (NapiRuntime.cpp) are backed by a real system
# libuv event loop - link it via pkg-config, scoped to ESCARGOT_NAPI only
# so non-napi builds stay unaffected.
PKG_CHECK_MODULES (LIBUV REQUIRED libuv)
SET (ESCARGOT_INCDIRS ${ESCARGOT_INCDIRS} ${LIBUV_INCLUDE_DIRS})
SET (ESCARGOT_LIBRARIES ${ESCARGOT_LIBRARIES} ${LIBUV_LIBRARIES})
SET (ESCARGOT_LDFLAGS ${ESCARGOT_LDFLAGS} ${LIBUV_LDFLAGS})
ENDIF()

IF (ESCARGOT_TLS_ACCESS_BY_ADDRESS)
SET (ESCARGOT_DEFINITIONS ${ESCARGOT_DEFINITIONS} -DENABLE_TLS_ACCESS_BY_ADDRESS)
ENDIF()
Expand Down
200 changes: 198 additions & 2 deletions build/escargot.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ IF (${ESCARGOT_OUTPUT} STREQUAL "cctest")
SET (INSTALL_GTEST OFF)
ADD_COMPILE_OPTIONS(${ESCARGOT_THIRDPARTY_CFLAGS})
ADD_SUBDIRECTORY (third_party/googletest)
FILE (GLOB CCTEST_SRC ${ESCARGOT_ROOT}/test/cctest/testapi.cpp)
FILE (GLOB CCTEST_SRC ${ESCARGOT_ROOT}/test/cctest/*.cpp)
ENDIF()

SET (ESCARGOT_SRC_LIST
Expand Down Expand Up @@ -303,8 +303,204 @@ ELSEIF (${ESCARGOT_OUTPUT} STREQUAL "static_lib")
ELSEIF (${ESCARGOT_OUTPUT} STREQUAL "cctest")
ADD_EXECUTABLE (${ESCARGOT_CCTEST_TARGET} ${ESCARGOT_SRC_LIST})

TARGET_LINK_LIBRARIES (${ESCARGOT_CCTEST_TARGET} PRIVATE ${ESCARGOT_LIBRARIES} ${ESCARGOT_LDFLAGS} ${LDFLAGS_FROM_ENV} gtest)
TARGET_LINK_LIBRARIES (${ESCARGOT_CCTEST_TARGET} PRIVATE ${ESCARGOT_LIBRARIES} ${ESCARGOT_LDFLAGS} ${LDFLAGS_FROM_ENV} gtest gtest_main)
TARGET_INCLUDE_DIRECTORIES (${ESCARGOT_CCTEST_TARGET} PRIVATE ${ESCARGOT_INCDIRS})
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE ${ESCARGOT_DEFINITIONS})
TARGET_COMPILE_OPTIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE ${ESCARGOT_CXXFLAGS} ${CXXFLAGS_FROM_ENV})

IF (ESCARGOT_NAPI)
# build real Node-API TCs (vendored under test/napi-tc) into .so files the
# cctest binary dlopen()s directly. Add the TC's source file(s), relative
# to test/js-native-api/, here as more TCs get supported; join multiple
# sources for one addon with `|` (see 7_factory_wrap). The .so is named
# after the FIRST source's stem (matching its binding.gyp target_name),
# not necessarily its containing directory.
SET (NAPI_TEST_ADDON_DIR ${CMAKE_BINARY_DIR}/napi_test_addons)
SET (NAPI_TEST_TC_ENTRIES
2_function_arguments/2_function_arguments.c
3_callbacks/3_callbacks.c
4_object_factory/4_object_factory.c
5_function_factory/5_function_factory.c
6_object_wrap/myobject.cc
7_factory_wrap/7_factory_wrap.cc|7_factory_wrap/myobject.cc
test_handle_scope/test_handle_scope.c
# --- test/cctest/napi_harness (NapiSuite.*) additions below ---
test_number/test_number.c|test_number/test_null.c
test_string/test_string.c|test_string/test_null.c
test_object/test_exceptions.c
test_array/test_array.c
test_conversions/test_conversions.c|test_conversions/test_null.c
test_properties/test_properties.c
test_constructor/test_constructor.c|test_constructor/test_null.c
test_symbol/test_symbol.c
test_bigint/test_bigint.c
test_error/test_error.c
test_exception/test_exception.c
test_typedarray/test_typedarray.c
test_typedarray/test_typedarray_sharedarraybuffer.c
test_date/test_date.c
test_new_target/test_new_target.c
test_reference/test_reference.c
# test_reference/binding.gyp and test_finalizer/binding.gyp each
# independently declare a target_name "test_finalizer" backed by
# a *different* source file; disambiguate the one from
# test_reference/ with an explicit output name (see the `=`
# override support in the loop below) so it doesn't collide with
# test_finalizer/test_finalizer.c's own entry name.
test_reference/test_finalizer.c=test_reference_test_finalizer
test_promise/test_promise.c
test_function/test_function.c
test_instance_data/test_instance_data.c
8_passing_wrapped/8_passing_wrapped.cc|8_passing_wrapped/myobject.cc
# A second, independently-built copy of 7_factory_wrap's own addon
# (identical source, different output .so) - NapiSuite.FactoryWrap
# (testnapi_suite.cpp) dlopen()s *this* one instead of the same
# .so Napi.FactoryWrap (testnapi.cpp) uses, so the two suites don't
# share that addon's static `finalizeCount`/`instanceCount`
# counters (see the NapiSuite report's cross-suite isolation note -
# neither suite ever dlclose()s, and test.js's own
# `assert.strictEqual(test.finalizeCount, 0)` at the top requires
# a fresh-from-zero counter every run).
7_factory_wrap/7_factory_wrap.cc|7_factory_wrap/myobject.cc=7_factory_wrap_napisuite
# These four now compile (node_api_create_object_with_properties/
# node_api_set_prototype/node_api_post_finalizer/
# node_api_is_sharedarraybuffer are declared - see the
# node_api_is_sharedarraybuffer are declared in Node.js's own
# src/js_native_api.h (fetched via the test/napi-tc submodule's
# sparse checkout, not the standalone node-api-headers package
# which lags behind) - and implemented
# in src/napi/NapiExtras.cpp). test_general/testEnvCleanup.js and
# test_finalizer/test_fatal_finalize.js are now wired into
# NapiSuite.* TESTs (test/cctest/testnapi_suite.cpp) - both are
# child_process.spawnSync-based self-respawn tests, supported via
# the harness's single-test CLI mode (--napi-run, same file).
# test_general/test.js and test_finalizer/test.js themselves (as
# opposed to the specific files above) still aren't wired in
# (worker_threads-style respawn, which this harness has no shim
# for); test_object/test.js and test_dataview/test.js are simply
# not yet ported. Listed here only to keep them compiling as
# further evidence the addon-level gap is closed.
test_object/test_object.c
test_general/test_general.c
test_dataview/test_dataview.c
test_finalizer/test_finalizer.c
# Now ported to real test.js under NapiSuite.* (test/cctest/
# testnapi_suite.cpp): test_dataview/test.js (above),
# test_sharedarraybuffer/test.js (needs node_api_create_
# sharedarraybuffer, implemented in src/napi/NapiExtras.cpp and
# declared in Node.js's own src/js_native_api.h), and
# test_reference_double_free/test.js (standard wrap/remove_wrap
# double-free regression, no new API needed).
test_sharedarraybuffer/test_sharedarraybuffer.c
test_reference_double_free/test_reference_double_free.c
)
# Tier 1 & 2 node-api/ addons (real test.js under NapiSuite.NodeApi*).
# Same entry grammar as NAPI_TEST_TC_ENTRIES, but sources resolve
# under test/napi-tc/test/node-api/ instead of js-native-api/. Many
# node-api addons name their single source binding.c/binding.cc, so
# the =explicitName override (derived name would collide as "binding")
# is used heavily here; test_general/test_exception also exist under
# js-native-api/, so their node-api builds get a node_api_ prefix to
# avoid the shared SO_PATH compile-def macro colliding.
SET (NAPI_TEST_TC_ENTRIES_NODE_API
test_uv_loop/test_uv_loop.cc
# Tier 1 (no worker_threads/async_hooks/child_process deps)
test_env_teardown_gc/binding.c=test_env_teardown_gc
test_fatal_exception/test_fatal_exception.c
test_init_order/test_init_order.cc
test_make_callback/binding.c=test_make_callback
test_make_callback_recurse/binding.c=test_make_callback_recurse
test_callback_scope/binding.c=test_callback_scope
# test_buffer deferred: this vendored copy's test_buffer.c calls the
# non-standard node_api_create_external_sharedarraybuffer and the
# test.js uses the global Buffer (not provided by this harness).
test_threadsafe_function_abort/binding.cc=test_threadsafe_function_abort
# Tier 2 (child_process self-respawn via the harness --napi-run shim)
test_async/test_async.c
test_cleanup_hook/binding.c=test_cleanup_hook
test_fatal/test_fatal.c
test_threadsafe_function/binding.c=test_threadsafe_function
test_threadsafe_function_shutdown/binding.cc=test_threadsafe_function_shutdown
)
SET (NAPI_TEST_ADDON_SOS)
# process one entries list, resolving each source relative to
# test/napi-tc/test/${_subdir}/ (js-native-api or node-api).
MACRO (BUILD_NAPI_TEST_ADDONS _subdir)
FOREACH (NAPI_TEST_TC_ENTRY ${ARGN})
# optional `=explicitName` suffix to override the derived output
# name, for the rare case where two addons in different test
# directories legitimately share a binding.gyp target_name (and
# would otherwise produce the same .so path/compile-def macro)
STRING (REPLACE "=" ";" NAPI_TEST_TC_ENTRY_PARTS ${NAPI_TEST_TC_ENTRY})
LIST (LENGTH NAPI_TEST_TC_ENTRY_PARTS NAPI_TEST_TC_ENTRY_NPARTS)
LIST (GET NAPI_TEST_TC_ENTRY_PARTS 0 NAPI_TEST_TC_ENTRY_SRCPART)

STRING (REPLACE "|" ";" NAPI_TEST_TC_SRC_RELS ${NAPI_TEST_TC_ENTRY_SRCPART})
SET (NAPI_TEST_TC_SRCS)
FOREACH (NAPI_TEST_TC_SRC_REL ${NAPI_TEST_TC_SRC_RELS})
LIST (APPEND NAPI_TEST_TC_SRCS ${ESCARGOT_ROOT}/test/napi-tc/test/${_subdir}/${NAPI_TEST_TC_SRC_REL})
ENDFOREACH()

LIST (GET NAPI_TEST_TC_SRC_RELS 0 NAPI_TEST_TC_FIRST_SRC_REL)
IF (${NAPI_TEST_TC_ENTRY_NPARTS} GREATER 1)
LIST (GET NAPI_TEST_TC_ENTRY_PARTS 1 NAPI_TEST_TC_NAME)
ELSE()
GET_FILENAME_COMPONENT (NAPI_TEST_TC_NAME ${NAPI_TEST_TC_FIRST_SRC_REL} NAME_WE)
ENDIF()
GET_FILENAME_COMPONENT (NAPI_TEST_TC_EXT ${NAPI_TEST_TC_FIRST_SRC_REL} EXT)
SET (NAPI_TEST_TC_SO ${NAPI_TEST_ADDON_DIR}/${NAPI_TEST_TC_NAME}.so)

IF (${NAPI_TEST_TC_EXT} STREQUAL ".c")
SET (NAPI_TEST_TC_COMPILER ${CMAKE_C_COMPILER})
ELSE()
SET (NAPI_TEST_TC_COMPILER ${CMAKE_CXX_COMPILER})
ENDIF()

ADD_CUSTOM_COMMAND (
OUTPUT ${NAPI_TEST_TC_SO}
COMMAND ${CMAKE_COMMAND} -E make_directory ${NAPI_TEST_ADDON_DIR}
COMMAND ${NAPI_TEST_TC_COMPILER} -shared -fPIC -DNAPI_VERSION=10 -I${ESCARGOT_ROOT}/test/napi-tc/src ${NAPI_TEST_TC_SRCS} -o ${NAPI_TEST_TC_SO}
DEPENDS ${NAPI_TEST_TC_SRCS}
COMMENT "Building napi test addon ${NAPI_TEST_TC_NAME}.so"
)
LIST (APPEND NAPI_TEST_ADDON_SOS ${NAPI_TEST_TC_SO})

STRING (TOUPPER ${NAPI_TEST_TC_NAME} NAPI_TEST_TC_NAME_UPPER)
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_${NAPI_TEST_TC_NAME_UPPER}_SO_PATH="${NAPI_TEST_TC_SO}")
ENDFOREACH()
ENDMACRO()
BUILD_NAPI_TEST_ADDONS (js-native-api ${NAPI_TEST_TC_ENTRIES})
BUILD_NAPI_TEST_ADDONS (node-api ${NAPI_TEST_TC_ENTRIES_NODE_API})

# Custom (non-upstream) test addons live in the main repo tree under
# test/cctest/napi_custom_addons/, NOT in the test/napi-tc submodule
# (which is a sparse checkout of nodejs/node and gets re-cloned in CI).
# Build them the same way as the macro above, just from a different
# source root.
SET (NAPI_CUSTOM_ADDON_DIR ${ESCARGOT_ROOT}/test/cctest/napi_custom_addons)
SET (NAPI_CUSTOM_SYMBOL_VERIFY_SO ${NAPI_TEST_ADDON_DIR}/test_symbol_verify.so)
SET (NAPI_CUSTOM_SYMBOL_VERIFY_SRC ${NAPI_CUSTOM_ADDON_DIR}/test_symbol_verify/test_symbol_verify.c)
ADD_CUSTOM_COMMAND (
OUTPUT ${NAPI_CUSTOM_SYMBOL_VERIFY_SO}
COMMAND ${CMAKE_COMMAND} -E make_directory ${NAPI_TEST_ADDON_DIR}
COMMAND ${CMAKE_C_COMPILER} -shared -fPIC -DNAPI_VERSION=10 -I${ESCARGOT_ROOT}/test/napi-tc/src -I${ESCARGOT_ROOT}/test/napi-tc/test/js-native-api ${NAPI_CUSTOM_SYMBOL_VERIFY_SRC} -o ${NAPI_CUSTOM_SYMBOL_VERIFY_SO}
DEPENDS ${NAPI_CUSTOM_SYMBOL_VERIFY_SRC}
COMMENT "Building napi custom test addon test_symbol_verify.so"
)
LIST (APPEND NAPI_TEST_ADDON_SOS ${NAPI_CUSTOM_SYMBOL_VERIFY_SO})
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_TEST_SYMBOL_VERIFY_SO_PATH="${NAPI_CUSTOM_SYMBOL_VERIFY_SO}")

ADD_CUSTOM_TARGET (napi_test_addons ALL DEPENDS ${NAPI_TEST_ADDON_SOS})
ADD_DEPENDENCIES (${ESCARGOT_CCTEST_TARGET} napi_test_addons)

# test/cctest/testnapi_suite.cpp (NapiSuite.*): the JS compatibility
# harness (require()/assert/common shims) and the base directory the
# real Node js-native-api test.js files live under, so the suite can
# resolve `test_number` -> `<dir>/test_number/test.js` etc. at runtime
# without hardcoding the repo layout into the .cpp itself.
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_HARNESS_JS_PATH="${ESCARGOT_ROOT}/test/cctest/napi_harness/harness.js")
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_TC_JS_DIR="${ESCARGOT_ROOT}/test/napi-tc/test/js-native-api")
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_TC_NODE_API_JS_DIR="${ESCARGOT_ROOT}/test/napi-tc/test/node-api")
TARGET_COMPILE_DEFINITIONS (${ESCARGOT_CCTEST_TARGET} PRIVATE NAPI_CUSTOM_ADDON_JS_DIR="${ESCARGOT_ROOT}/test/cctest/napi_custom_addons")
ENDIF()
ENDIF()
Loading
Loading