Skip to content

Commit ec1f4a2

Browse files
committed
build fix
1 parent 3fc7789 commit ec1f4a2

File tree

2 files changed

+112
-94
lines changed

2 files changed

+112
-94
lines changed

.github/workflows/build.yml

Lines changed: 27 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
- os: ubuntu-latest
2323
arch: x64
2424
node_arch: x64
25-
cmake_arch: x64
25+
cmake_arch: x86_64
2626

2727
# macOS builds
2828
- os: macos-latest
@@ -257,48 +257,6 @@ jobs:
257257
--no-retry \
258258
--verbose
259259
260-
# 9. 查找并验证构建产物 (兼容不同构建目录结构)
261-
- name: Find and verify build artifacts
262-
id: find_artifacts
263-
run: |
264-
echo "=== Searching for build artifacts ==="
265-
266-
# 定义可能的构建产物路径
267-
POSSIBLE_PATHS=(
268-
"build/wsjtx_lib_nodejs.node"
269-
"build/Release/wsjtx_lib_nodejs.node"
270-
"build/Debug/wsjtx_lib_nodejs.node"
271-
)
272-
273-
FOUND_PATH=""
274-
for path in "${POSSIBLE_PATHS[@]}"; do
275-
if [ -f "$path" ]; then
276-
echo "✅ Found native module at: $path"
277-
FOUND_PATH="$path"
278-
break
279-
else
280-
echo "❌ Not found: $path"
281-
fi
282-
done
283-
284-
if [ -z "$FOUND_PATH" ]; then
285-
echo "❌ Native module not found in any expected location!"
286-
echo "Build directory contents:"
287-
find build -type f -name "*.node" || echo "No .node files found"
288-
find build -type f || echo "No files found in build directory"
289-
exit 1
290-
fi
291-
292-
# 验证文件
293-
ls -la "$FOUND_PATH"
294-
file "$FOUND_PATH" || echo "file command not available"
295-
296-
# 设置输出变量
297-
echo "artifact_path=$FOUND_PATH" >> $GITHUB_OUTPUT
298-
echo "artifact_dir=$(dirname $FOUND_PATH)" >> $GITHUB_OUTPUT
299-
echo "artifact_name=$(basename $FOUND_PATH)" >> $GITHUB_OUTPUT
300-
shell: bash
301-
302260
# 10. 运行测试
303261
- name: Run tests
304262
run: |
@@ -310,30 +268,22 @@ jobs:
310268
if [ -f "dist/test/wsjtx.basic.test.js" ]; then
311269
echo "✅ Basic test file found: dist/test/wsjtx.basic.test.js"
312270
313-
# 检查原生模块是否存在 (使用步骤9找到的路径)
314-
ARTIFACT_PATH="${{ steps.find_artifacts.outputs.artifact_path }}"
315-
if [ -f "$ARTIFACT_PATH" ]; then
316-
echo "✅ Native module found: $ARTIFACT_PATH"
317-
318-
# 确保原生模块在正确的位置
319-
if [ "${{ runner.os }}" = "Windows" ]; then
320-
# Windows: 直接使用找到的路径
321-
echo "Using native module at: $ARTIFACT_PATH"
322-
# 验证文件存在
323-
ls -la "$ARTIFACT_PATH"
324-
else
325-
# Unix: 复制到build目录
326-
mkdir -p build
327-
cp "$ARTIFACT_PATH" build/
328-
echo "Copied native module to build directory"
329-
ls -la build/wsjtx_lib_nodejs.node
330-
fi
331-
271+
# 检查原生模块是否存在 - 使用旧版本的固定路径逻辑
272+
if [ -f "build/Release/wsjtx_lib_nodejs.node" ]; then
273+
echo "✅ Native module found: build/Release/wsjtx_lib_nodejs.node"
274+
ls -la build/Release/wsjtx_lib_nodejs.node
275+
# 运行基础测试
276+
npm test
277+
elif [ -f "build/wsjtx_lib_nodejs.node" ]; then
278+
echo "✅ Native module found: build/wsjtx_lib_nodejs.node"
279+
ls -la build/wsjtx_lib_nodejs.node
280+
# 确保在正确位置,某些系统可能需要Release子目录
281+
mkdir -p build/Release
282+
cp build/wsjtx_lib_nodejs.node build/Release/
332283
# 运行基础测试
333284
npm test
334285
else
335-
echo "❌ Native module not found at: $ARTIFACT_PATH"
336-
echo "Searching for .node files..."
286+
echo "❌ Native module not found! Searching for .node files..."
337287
find . -name "*.node" || echo "No .node files found"
338288
exit 1
339289
fi
@@ -352,9 +302,17 @@ jobs:
352302
TARGET_DIR="prebuilds/${{ matrix.os }}-${{ matrix.arch }}"
353303
mkdir -p "$TARGET_DIR"
354304
355-
# 复制构建的 .node 文件
356-
ARTIFACT_PATH="${{ steps.find_artifacts.outputs.artifact_path }}"
357-
cp "$ARTIFACT_PATH" "$TARGET_DIR/"
305+
# 复制构建的 .node 文件 - 检查两个可能的位置
306+
if [ -f "build/Release/wsjtx_lib_nodejs.node" ]; then
307+
cp build/Release/wsjtx_lib_nodejs.node "$TARGET_DIR/"
308+
echo "Copied from build/Release/"
309+
elif [ -f "build/wsjtx_lib_nodejs.node" ]; then
310+
cp build/wsjtx_lib_nodejs.node "$TARGET_DIR/"
311+
echo "Copied from build/"
312+
else
313+
echo "❌ Native module not found for packaging!"
314+
exit 1
315+
fi
358316
359317
# 显示构建结果
360318
echo "构建完成的文件:"
@@ -367,8 +325,8 @@ jobs:
367325
"arch": "${{ matrix.arch }}",
368326
"node_version": "${{ env.NODE_VERSION }}",
369327
"build_time": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
370-
"artifact_path": "$ARTIFACT_PATH",
371-
"file_size": $(stat -c%s "$ARTIFACT_PATH" 2>/dev/null || stat -f%z "$ARTIFACT_PATH" 2>/dev/null || echo "unknown")
328+
"cmake_arch": "${{ matrix.cmake_arch }}",
329+
"file_size": $(stat -c%s "$TARGET_DIR"/*.node 2>/dev/null || stat -f%z "$TARGET_DIR"/*.node 2>/dev/null || echo "unknown")
372330
}
373331
EOF
374332

CMakeLists.txt

Lines changed: 85 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
cmake_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
813
set(CMAKE_CXX_STANDARD 17)
@@ -11,7 +16,22 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
1116
# Enable position independent code for all targets (including subprojects)
1217
set(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 特定标志
1737
if(WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "GNU")
@@ -128,7 +148,7 @@ endif()
128148
# Find FFTW3 using pkg-config
129149
pkg_check_modules(FFTW3F REQUIRED fftw3f)
130150

131-
# Check for FFTW3 threads support
151+
# Check for FFTW3 threads support - 改进的检测逻辑
132152
if(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}")
181221
endif()
182222

183223
# Include directories
184224
include_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
291332
file(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
297357
set_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}")
317376
else()
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}")
325383
endif()
@@ -335,7 +393,7 @@ target_compile_definitions(${PROJECT_NAME} PRIVATE
335393
# Add compile flags
336394
target_compile_options(${PROJECT_NAME} PRIVATE ${FFTW3F_CFLAGS_OTHER})
337395

338-
# 链接 Node.js 运行时库
396+
# Link libraries with MinGW-specific handling
339397
if(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()
352410
else()
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()
356416
endif()
357417

358418
target_link_libraries(${PROJECT_NAME} PRIVATE

0 commit comments

Comments
 (0)