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