• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2025 Huawei Device Co., Ltd.
2# Licensed under the Apache License, Version 2.0 (the "License");
3# you may not use this file except in compliance with the License.
4# You may obtain a copy of the License at
5#
6# http://www.apache.org/licenses/LICENSE-2.0
7#
8# Unless required by applicable law or agreed to in writing, software
9# distributed under the License is distributed on an "AS IS" BASIS,
10# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11# See the License for the specific language governing permissions and
12# limitations under the License.
13
14
15function(panda_add_node_library TARGET)
16    # Parse arguments
17    cmake_parse_arguments(
18        ARG
19        ""
20        "LIBRARY_OUTPUT_DIRECTORY"
21        "SOURCES;LIBRARIES;OUTPUT_SUFFIX"
22        ${ARGN}
23    )
24
25    if(NOT DEFINED ARG_LIBRARY_OUTPUT_DIRECTORY)
26        # Set default value
27        set(ARG_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/bindings)
28    endif()
29
30    panda_add_library(${TARGET} SHARED ${ARG_SOURCES})
31    panda_target_link_libraries(${TARGET} ${ARG_LIBRARIES})
32
33    if(PANDA_TARGET_OHOS)
34        panda_target_link_libraries(${TARGET} ace_napi.z  -Wl,--no-undefined)
35    else()
36        panda_target_include_directories(${TARGET} SYSTEM PRIVATE ${NAPI_HEADERS_PATH})
37        set_target_properties(${TARGET}
38            PROPERTIES
39                # Set module name
40                PREFIX ""
41                OUTPUT_NAME "${TARGET}"
42                SUFFIX ${ARG_OUTPUT_SUFFIX}
43
44                # Set output directory
45                LIBRARY_OUTPUT_DIRECTORY ${ARG_LIBRARY_OUTPUT_DIRECTORY}
46        )
47    endif()
48endfunction()
49
50# install node
51set(NODE_VERSION "v18.13.0")
52set(DISTRO "linux-x64")
53
54execute_process(COMMAND ${PANDA_ROOT}/scripts/install-third-party --node
55        WORKING_DIRECTORY ${PANDA_ROOT}
56        RESULT_VARIABLE NODEJS_DOWNLOAD_OK)
57if (NOT NODEJS_DOWNLOAD_OK EQUAL 0)
58    message(FATAL_ERROR "Unable to install required nodejs dependencies")
59endif()
60
61set(NODE_THIRD_PARTY_SOURCES_DIR ${PANDA_THIRD_PARTY_SOURCES_DIR}/nodejs)
62set(NAPI_HEADERS_PATH ${NODE_THIRD_PARTY_SOURCES_DIR}/node-${NODE_VERSION}-${DISTRO}/include/node)
63set(NODE_BINARY ${PANDA_ROOT}/third_party/nodejs/node-${NODE_VERSION}-${DISTRO}/bin/node)
64
65set(NAPI_BINDINGS_LIB "ts_bindings")
66
67set(BINDINGS_NAPI_SRC
68  ./src/common-interop.cpp
69  ./src/convertors-napi.cpp
70  ./src/callback-resource.cpp
71  ./src/lsp.cpp
72)
73
74# PUBLIC arkbase es2panda-lib es2panda-public
75# PRIVATE arkbytecodeopt
76set(ES2PANDA_LIBS
77  es2panda-lib
78  es2panda-public
79  es2panda_lsp
80)
81
82set(TS_INTEROP_MODULE
83  "-DTS_INTEROP_MODULE=NativeModule"
84  "-DTS_USE_NODE_VM"
85  "-DINTEROP_LIBRARY_NAME=ts_bindings"
86  "-DTS_NAPI"
87)
88
89if(PANDA_TARGET_WINDOWS)
90  set(NODE_API_LIB libnode_api.a)
91  set(NODE_WIN_API_LIB_PATH ${NODE_THIRD_PARTY_SOURCES_DIR}/node-${NODE_VERSION}-${DISTRO}/lib/${NODE_API_LIB})
92  list(APPEND ES2PANDA_LIBS ${NODE_WIN_API_LIB_PATH})
93  list(APPEND BINDINGS_NAPI_SRC ./src/win-dynamic-node.cpp)
94endif()
95
96panda_add_node_library(${NAPI_BINDINGS_LIB}
97  SOURCES ${BINDINGS_NAPI_SRC}
98  LIBRARIES ${ES2PANDA_LIBS}
99  OUTPUT_SUFFIX ".node"
100)
101
102panda_target_include_directories(${NAPI_BINDINGS_LIB}
103  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include
104  SYSTEM PRIVATE ${NAPI_HEADERS_PATH}
105  PRIVATE ${ES2PANDA_ROOT}
106  PRIVATE ${OUTPUT_DIR}
107)
108
109panda_target_compile_definitions(${NAPI_BINDINGS_LIB} PRIVATE ${TS_INTEROP_MODULE})
110panda_target_compile_options(${NAPI_BINDINGS_LIB}
111  PRIVATE -fexceptions -Werror=shadow
112)
113
114panda_add_sanitizers(TARGET ${NAPI_BINDINGS_LIB}
115  SANITIZERS ${PANDA_SANITIZERS_LIST}
116)
117