11cmake_minimum_required (VERSION 3.15)
2- project (wsjtx_lib_nodejs LANGUAGES C CXX Fortran)
32
4- # 包含 cmake-js 提供的 CMake 模块 - 这必须在最前面
5- # 注意:cmake-js 7.x 不再使用 CMAKE_JS_DIR,改为直接使用变量
3+ # 禁用 vcpkg Manifest 模式,使用经典模式
4+ if (DEFINED CMAKE_TOOLCHAIN_FILE AND CMAKE_TOOLCHAIN_FILE MATCHES "vcpkg" )
5+ set (VCPKG_MANIFEST_MODE OFF CACHE BOOL "Disable vcpkg manifest mode" FORCE)
6+ set (VCPKG_MANIFEST_INSTALL OFF CACHE BOOL "Disable vcpkg manifest install" FORCE)
7+ message (STATUS "Detected vcpkg toolchain, disabling manifest mode" )
8+ endif ()
9+
10+ project (wsjtx_lib_nodejs LANGUAGES C CXX Fortran)
611
712# Set C++ standard
813set (CMAKE_CXX_STANDARD 17)
@@ -11,7 +16,22 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
1116# Enable position independent code for all targets (including subprojects)
1217set (CMAKE_POSITION_INDEPENDENT_CODE ON )
1318
14- # 注意:Node.js 头文件路径将在创建目标后单独为 C++ 目标设置
19+ # Include cmake-js - this must come first to get CMAKE_JS_* variables
20+ if (CMAKE_JS_INC)
21+ include_directories (${CMAKE_JS_INC} )
22+ endif ()
23+
24+ # Add Node.js include path for node_api.h (for all platforms)
25+ execute_process (
26+ COMMAND node -p "require('path').dirname(process.execPath) + '/../include/node'"
27+ OUTPUT_VARIABLE NODE_INCLUDE_DIR
28+ OUTPUT_STRIP_TRAILING_WHITESPACE
29+ ERROR_QUIET
30+ )
31+ if (NODE_INCLUDE_DIR AND EXISTS "${NODE_INCLUDE_DIR} " )
32+ include_directories (${NODE_INCLUDE_DIR} )
33+ message (STATUS "Added Node.js include directory: ${NODE_INCLUDE_DIR} " )
34+ endif ()
1535
1636# **关键修复**: Windows + MinGW 环境检测并清除 MSVC 特定标志
1737if (WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
@@ -128,7 +148,7 @@ endif()
128148# Find FFTW3 using pkg-config
129149pkg_check_modules(FFTW3F REQUIRED fftw3f)
130150
131- # Check for FFTW3 threads support
151+ # Check for FFTW3 threads support - 改进的检测逻辑
132152if (UNIX AND NOT APPLE )
133153 # Linux: search in standard locations
134154 find_library (FFTW3F_THREADS_LIB
@@ -168,22 +188,43 @@ else()
168188 PATHS /mingw64/lib D:/msys64/mingw64/lib
169189 NO_DEFAULT_PATH
170190 )
171-
172- if (FFTW3F_THREADS_LIB)
173- message (STATUS "FFTW3 with threads support found: ${FFTW3F_THREADS_LIB} " )
174- set (FFTW_THREADS_LIBRARIES fftw3f_threads)
175- set (FFTW_HAS_THREADS TRUE )
176- else ()
177- message (STATUS "FFTW3 threads not found, using single-threaded version" )
178- set (FFTW_THREADS_LIBRARIES "" )
179- set (FFTW_HAS_THREADS FALSE )
191+ endif ()
192+
193+ if (FFTW3F_THREADS_LIB)
194+ message (STATUS "FFTW3 with threads support found: ${FFTW3F_THREADS_LIB} " )
195+ set (FFTW_THREADS_LIBRARIES fftw3f_threads)
196+ set (FFTW_HAS_THREADS TRUE )
197+ else ()
198+ message (STATUS "FFTW3 threads not found, using single-threaded version" )
199+ set (FFTW_THREADS_LIBRARIES "" )
200+ set (FFTW_HAS_THREADS FALSE )
201+ endif ()
202+
203+ # Auto-detect node-addon-api path (monorepo vs standalone)
204+ set (NODE_ADDON_API_PATHS
205+ "${CMAKE_SOURCE_DIR} /node_modules/node-addon-api" # Standalone project
206+ "${CMAKE_SOURCE_DIR} /../../node_modules/node-addon-api" # Monorepo (2 levels up)
207+ "${CMAKE_SOURCE_DIR} /../../../node_modules/node-addon-api" # Monorepo (3 levels up)
208+ )
209+
210+ set (NODE_ADDON_API_PATH "" )
211+ foreach (path ${NODE_ADDON_API_PATHS} )
212+ if (EXISTS "${path} /napi.h" )
213+ set (NODE_ADDON_API_PATH "${path} " )
214+ message (STATUS "Found node-addon-api at: ${NODE_ADDON_API_PATH} " )
215+ break ()
180216 endif ()
217+ endforeach ()
218+
219+ if (NOT NODE_ADDON_API_PATH)
220+ message (FATAL_ERROR "Could not find node-addon-api. Searched paths: ${NODE_ADDON_API_PATHS} " )
181221endif ()
182222
183223# Include directories
184224include_directories (
185225 ${CMAKE_SOURCE_DIR} /wsjtx_lib
186226 ${CMAKE_SOURCE_DIR} /native
227+ ${NODE_ADDON_API_PATH}
187228 ${FFTW3F_INCLUDE_DIRS}
188229 ${Boost_INCLUDE_DIRS}
189230)
@@ -290,8 +331,27 @@ link_directories(${FFTW3F_LIBRARY_DIRS})
290331# Source files for the Node.js addon
291332file (GLOB_RECURSE NATIVE_SOURCES "native/*.cpp" "native/*.h" )
292333
293- # 定义输出库(会生成 wsjtx_lib_nodejs.node)
294- add_library (${PROJECT_NAME} SHARED ${NATIVE_SOURCES} )
334+ # Create the Node.js addon with MinGW-specific handling
335+ if (WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
336+ # MinGW build: exclude Windows delay load hook
337+ add_library (${PROJECT_NAME} SHARED
338+ ${NATIVE_SOURCES}
339+ )
340+ message (STATUS "MinGW build: excluding CMAKE_JS_SRC (Windows delay load hook)" )
341+ else ()
342+ # Other platforms: include CMAKE_JS_SRC if available
343+ if (CMAKE_JS_SRC)
344+ add_library (${PROJECT_NAME} SHARED
345+ ${NATIVE_SOURCES}
346+ ${CMAKE_JS_SRC}
347+ )
348+ message (STATUS "Non-MinGW build: including CMAKE_JS_SRC for delay-load hook" )
349+ else ()
350+ add_library (${PROJECT_NAME} SHARED
351+ ${NATIVE_SOURCES}
352+ )
353+ endif ()
354+ endif ()
295355
296356# Set properties for Node.js addon
297357set_target_properties (${PROJECT_NAME} PROPERTIES
@@ -309,17 +369,15 @@ if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
309369 "/mingw64/include/node"
310370 "/mingw64/include/node/node"
311371 "/mingw64/include"
312- "${CMAKE_SOURCE_DIR} /node_modules/node-addon-api"
313- "${CMAKE_SOURCE_DIR} /node_modules/node-addon-api/include"
372+ "${NODE_ADDON_API_PATH} "
314373 )
315374 message (STATUS "MinGW build: using MSYS2 Node.js headers and local node-addon-api" )
316375 message (STATUS "CMAKE_JS_INC: ${CMAKE_JS_INC} " )
317376else ()
318377 # 其他平台:使用 cmake-js 提供的头文件路径 + 项目的 node-addon-api
319378 target_include_directories (${PROJECT_NAME} PRIVATE
320379 ${CMAKE_JS_INC}
321- "${CMAKE_SOURCE_DIR} /node_modules/node-addon-api"
322- "${CMAKE_SOURCE_DIR} /node_modules/node-addon-api/include"
380+ "${NODE_ADDON_API_PATH} "
323381 )
324382 message (STATUS "Using cmake-js provided headers: ${CMAKE_JS_INC} " )
325383endif ()
@@ -335,7 +393,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE
335393# Add compile flags
336394target_compile_options (${PROJECT_NAME} PRIVATE ${FFTW3F_CFLAGS_OTHER} )
337395
338- # 链接 Node.js 运行时库
396+ # Link libraries with MinGW-specific handling
339397if (WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" )
340398 # Windows MinGW: 复制库文件到本地目录避免路径问题
341399 set (LOCAL_NODE_LIB "${CMAKE_BINARY_DIR} /node.lib" )
@@ -347,12 +405,14 @@ if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
347405 target_link_libraries (${PROJECT_NAME} PRIVATE "${LOCAL_NODE_LIB} " )
348406 message (STATUS "MinGW build: Using copied Node.js library: ${LOCAL_NODE_LIB} " )
349407 else ()
350- message (FATAL_ERROR "Node.js library not found at: ${CMAKE_JS_LIB} " )
408+ message (STATUS "MinGW build: CMAKE_JS_LIB not found, skipping Node.js library linking " )
351409 endif ()
352410else ()
353- # 其他平台:使用 cmake-js 提供的库
354- target_link_libraries (${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB} )
355- message (STATUS "Using cmake-js provided library: ${CMAKE_JS_LIB} " )
411+ # Other platforms: link CMAKE_JS_LIB if available
412+ if (CMAKE_JS_LIB)
413+ target_link_libraries (${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB} )
414+ message (STATUS "Using cmake-js provided library: ${CMAKE_JS_LIB} " )
415+ endif ()
356416endif ()
357417
358418target_link_libraries (${PROJECT_NAME} PRIVATE
0 commit comments