Skip to content

Commit 02d8782

Browse files
committed
feat: implement separation of MinGW and MSVC build processes for wsjtx_bridge.dll and .node extension
1 parent 38084f0 commit 02d8782

2 files changed

Lines changed: 1788 additions & 64 deletions

File tree

CMakeLists.txt

Lines changed: 39 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,11 @@ if(NOT WSJTX_SKIP_LIB_BUILD)
388388
endforeach()
389389

390390
message(STATUS "wsjtx_bridge.dll will be built with MinGW and linked with wsjtx_lib")
391+
392+
# MinGW阶段只构建wsjtx_bridge.dll,不构建.node扩展
393+
# .node扩展应该在MSVC阶段构建
394+
message(STATUS "MinGW stage complete. Skipping .node build (will be built in MSVC stage)")
395+
return()
391396
endif()
392397
else()
393398
message(STATUS "Skipping wsjtx_lib build (MSVC mode)")
@@ -396,29 +401,32 @@ endif()
396401
# Link directories (must be before creating target)
397402
link_directories(${FFTW3F_LIBRARY_DIRS})
398403

404+
# ==================== 构建 Node.js Addon (.node) ====================
405+
# 注意: MinGW模式在上面已经return(),不会执行到这里
406+
# 这部分只在 MSVC 模式或 Linux/macOS 平台执行
407+
399408
# Source files for the Node.js addon
400409
file(GLOB_RECURSE NATIVE_SOURCES "native/*.cpp" "native/*.h")
401410

402-
# Create the Node.js addon with MinGW-specific handling
403-
if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
404-
# MinGW build: exclude Windows delay load hook
405-
add_library(${PROJECT_NAME} SHARED
411+
# MSVC模式: 排除wsjtx_bridge.cpp (这是MinGW专用的C API桥接层)
412+
if(WIN32 AND MSVC)
413+
list(FILTER NATIVE_SOURCES EXCLUDE REGEX ".*wsjtx_bridge\\.(cpp|h)$")
414+
message(STATUS "MSVC mode: excluding wsjtx_bridge.cpp from .node build")
415+
endif()
416+
417+
# Create the Node.js addon
418+
# 注意: 此时MinGW模式已经return,只剩MSVC/Linux/macOS执行到这里
419+
if(CMAKE_JS_SRC)
420+
add_library(${PROJECT_NAME} SHARED
406421
${NATIVE_SOURCES}
422+
${CMAKE_JS_SRC}
407423
)
408-
message(STATUS "MinGW build: excluding CMAKE_JS_SRC (Windows delay load hook)")
424+
message(STATUS "Building ${PROJECT_NAME} with CMAKE_JS_SRC (delay-load hook)")
409425
else()
410-
# Other platforms: include CMAKE_JS_SRC if available
411-
if(CMAKE_JS_SRC)
412-
add_library(${PROJECT_NAME} SHARED
413-
${NATIVE_SOURCES}
414-
${CMAKE_JS_SRC}
415-
)
416-
message(STATUS "Non-MinGW build: including CMAKE_JS_SRC for delay-load hook")
417-
else()
418-
add_library(${PROJECT_NAME} SHARED
419-
${NATIVE_SOURCES}
420-
)
421-
endif()
426+
add_library(${PROJECT_NAME} SHARED
427+
${NATIVE_SOURCES}
428+
)
429+
message(STATUS "Building ${PROJECT_NAME} without CMAKE_JS_SRC")
422430
endif()
423431

424432
# Set properties for Node.js addon
@@ -456,33 +464,23 @@ if(UNIX AND NOT APPLE)
456464
)
457465
endif()
458466

459-
# 设置 Node.js 和 node-addon-api 头文件路径(仅针对 C++ 目标)
460-
if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
461-
# Windows MinGW: 使用 MSYS2 的 Node.js 头文件 + 项目的 node-addon-api
462-
target_include_directories(${PROJECT_NAME} PRIVATE
463-
"${CMAKE_JS_INC}"
464-
"/mingw64/include/node"
465-
"/mingw64/include/node/node"
466-
"/mingw64/include"
467-
"${NODE_ADDON_API_PATH}"
468-
)
469-
message(STATUS "MinGW build: using MSYS2 Node.js headers and local node-addon-api")
470-
message(STATUS "CMAKE_JS_INC: ${CMAKE_JS_INC}")
471-
elseif(WIN32 AND MSVC)
472-
# Windows MSVC: 使用 cmake-js 头文件 + 项目的 node-addon-api + native目录(用于wsjtx_bridge.h)
467+
# 设置 Node.js 和 node-addon-api 头文件路径
468+
# 注意: MinGW模式已经return,这里只处理MSVC和其他平台
469+
if(WIN32 AND MSVC)
470+
# Windows MSVC: 需要包含native目录(用于wsjtx_bridge.h声明)
473471
target_include_directories(${PROJECT_NAME} PRIVATE
474472
${CMAKE_JS_INC}
475473
"${NODE_ADDON_API_PATH}"
476474
"${CMAKE_CURRENT_SOURCE_DIR}/native"
477475
)
478-
message(STATUS "MSVC build: using cmake-js headers and native directory for wsjtx_bridge.h")
476+
message(STATUS "MSVC build: including native directory for wsjtx_bridge.h")
479477
else()
480-
# 其他平台:使用 cmake-js 提供的头文件路径 + 项目的 node-addon-api
478+
# Linux/macOS: 标准配置
481479
target_include_directories(${PROJECT_NAME} PRIVATE
482480
${CMAKE_JS_INC}
483481
"${NODE_ADDON_API_PATH}"
484482
)
485-
message(STATUS "Using cmake-js provided headers: ${CMAKE_JS_INC}")
483+
message(STATUS "Non-Windows build: using standard cmake-js headers")
486484
endif()
487485

488486
# Compiler-specific options
@@ -496,26 +494,10 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE
496494
# Add compile flags
497495
target_compile_options(${PROJECT_NAME} PRIVATE ${FFTW3F_CFLAGS_OTHER})
498496

499-
# Link libraries with MinGW-specific handling
500-
if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
501-
# Windows MinGW: 复制库文件到本地目录避免路径问题
502-
set(LOCAL_NODE_LIB "${CMAKE_BINARY_DIR}/node.lib")
503-
504-
# 检查并复制 Node.js 库文件
505-
if(EXISTS "${CMAKE_JS_LIB}")
506-
message(STATUS "Copying Node.js library from: ${CMAKE_JS_LIB}")
507-
configure_file("${CMAKE_JS_LIB}" "${LOCAL_NODE_LIB}" COPYONLY)
508-
target_link_libraries(${PROJECT_NAME} PRIVATE "${LOCAL_NODE_LIB}")
509-
message(STATUS "MinGW build: Using copied Node.js library: ${LOCAL_NODE_LIB}")
510-
else()
511-
message(STATUS "MinGW build: CMAKE_JS_LIB not found, skipping Node.js library linking")
512-
endif()
513-
else()
514-
# Other platforms: link CMAKE_JS_LIB if available
515-
if(CMAKE_JS_LIB)
516-
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB})
517-
message(STATUS "Using cmake-js provided library: ${CMAKE_JS_LIB}")
518-
endif()
497+
# Link Node.js library (MSVC/Linux/macOS only, MinGW已return)
498+
if(CMAKE_JS_LIB)
499+
target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_JS_LIB})
500+
message(STATUS "Linking cmake-js library: ${CMAKE_JS_LIB}")
519501
endif()
520502

521503
# Link libraries based on build mode
@@ -557,17 +539,10 @@ elseif(UNIX)
557539
# Linux specific linker flags for Node.js extensions
558540
# Note: We don't use --no-undefined because Node.js extensions
559541
# have symbols that are resolved at runtime by the Node.js process
560-
target_link_options(${PROJECT_NAME} PRIVATE
542+
target_link_options(${PROJECT_NAME} PRIVATE
561543
-Wl,--as-needed
562544
)
563545
elseif(WIN32)
564-
# Windows with MinGW-w64 linking
565-
target_link_libraries(${PROJECT_NAME} PRIVATE
566-
gfortran
567-
gcc_s
568-
pthread
569-
)
570-
if(FFTW_HAS_THREADS)
571-
target_link_libraries(${PROJECT_NAME} PRIVATE fftw3f_threads)
572-
endif()
546+
# Windows MSVC: 不需要链接Fortran库,会通过wsjtx_bridge.dll动态加载
547+
message(STATUS "Windows MSVC: Fortran libraries will be loaded via wsjtx_bridge.dll")
573548
endif()

0 commit comments

Comments
 (0)