Skip to content

Commit 0018cde

Browse files
committed
feat: enhance Windows build process with two-stage compilation for wsjtx_lib and wsjtx_bridge
1 parent 3d85ff5 commit 0018cde

2 files changed

Lines changed: 211 additions & 156 deletions

File tree

.github/workflows/build.yml

Lines changed: 73 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -201,54 +201,86 @@ jobs:
201201
# 新架构: wsjtx_lib (static) -> wsjtx_bridge (dynamic) -> .node (loads bridge)
202202
npx cmake-js compile --arch=${{ matrix.cmake_arch }}
203203
204-
# 8. Windows构建 - 统一使用MinGW(简化后的单阶段构建)
205-
- name: Build native module (Windows/MinGW)
204+
# 8a. Windows构建 - 第一步:MinGW构建wsjtx_lib和wsjtx_bridge.dll
205+
- name: Build wsjtx_bridge.dll (Windows/MinGW)
206206
if: runner.os == 'Windows'
207207
shell: msys2 {0}
208208
run: |
209-
echo "=== Building with MinGW (unified architecture) ==="
210-
echo "New build flow: wsjtx_lib -> wsjtx_bridge.dll -> .node"
209+
echo "=== Step 1: Building wsjtx_lib + wsjtx_bridge.dll with MinGW ==="
210+
echo "Architecture: wsjtx_lib (static) + wsjtx_bridge.dll (dynamic)"
211211
212212
# 清理之前的构建
213-
rm -rf build/
214-
215-
# 使用cmake-js进行完整构建(MinGW工具链)
216-
npx cmake-js compile --arch=x64 \
217-
--CDCMAKE_BUILD_TYPE=Release \
218-
--CDCMAKE_C_COMPILER=gcc \
219-
--CDCMAKE_CXX_COMPILER=g++ \
220-
--CDCMAKE_Fortran_COMPILER=gfortran \
221-
--CDCMAKE_PREFIX_PATH=/mingw64 \
222-
--CDPKG_CONFIG_EXECUTABLE=/mingw64/bin/pkg-config
213+
rm -rf build_mingw/
214+
mkdir -p build_mingw
215+
cd build_mingw
216+
217+
# 使用CMake直接构建(MinGW Makefiles generator)
218+
cmake .. \
219+
-G "MinGW Makefiles" \
220+
-DCMAKE_BUILD_TYPE=Release \
221+
-DCMAKE_C_COMPILER=gcc \
222+
-DCMAKE_CXX_COMPILER=g++ \
223+
-DCMAKE_Fortran_COMPILER=gfortran \
224+
-DCMAKE_PREFIX_PATH=/mingw64 \
225+
-DPKG_CONFIG_EXECUTABLE=/mingw64/bin/pkg-config \
226+
-DWSJTX_BUILD_LIBS=ON \
227+
-DWSJTX_BUILD_NODE_ADDON=OFF
228+
229+
# 构建
230+
cmake --build . --config Release
223231
224232
# 验证构建产物
225233
echo ""
226-
echo "🔍 Verifying build artifacts..."
227-
if [ ! -f "build/Release/wsjtx_bridge.dll" ]; then
234+
echo "🔍 Verifying MinGW build artifacts..."
235+
if [ ! -f "Release/wsjtx_bridge.dll" ]; then
228236
echo "❌ Error: wsjtx_bridge.dll not found!"
229-
ls -la build/Release/ || ls -la build/
237+
find . -name "wsjtx_bridge.dll" -o -name "libwsjtx_bridge.*"
230238
exit 1
231239
fi
232240
233-
if [ ! -f "build/Release/wsjtx_lib_nodejs.node" ]; then
234-
echo "❌ Error: wsjtx_lib_nodejs.node not found!"
235-
ls -la build/Release/ || ls -la build/
236-
exit 1
237-
fi
241+
echo "✅ wsjtx_bridge.dll built successfully"
242+
ls -lh Release/wsjtx_bridge.dll
238243
239-
echo "✅ All build artifacts generated successfully"
240-
ls -lh build/Release/
244+
cd ..
241245
242-
# 创建prebuilds目录并复制所有必需文件
243-
echo ""
244-
echo "📦 Packaging prebuilt binaries..."
246+
# 8b. Windows构建 - 第二步:MSVC构建.node扩展
247+
- name: Build .node extension (Windows/MSVC)
248+
if: runner.os == 'Windows'
249+
shell: cmd
250+
run: |
251+
echo === Step 2: Building .node extension with MSVC ===
252+
echo Architecture: .node (loads wsjtx_bridge.dll at runtime)
253+
254+
REM 使用cmake-js构建.node(自动使用Visual Studio)
255+
npx cmake-js compile --arch=x64 --CDWSJTX_BUILD_LIBS=OFF --CDWSJTX_BUILD_NODE_ADDON=ON
256+
257+
REM 验证构建产物
258+
echo.
259+
echo Verifying MSVC build artifacts...
260+
if not exist "build\Release\wsjtx_lib_nodejs.node" (
261+
echo Error: wsjtx_lib_nodejs.node not found!
262+
dir /s /b build\*.node
263+
exit /b 1
264+
)
265+
266+
echo All build artifacts generated successfully
267+
dir build\Release\*.node
268+
269+
# 8c. Windows打包 - 复制所有必需文件
270+
- name: Package Windows binaries
271+
if: runner.os == 'Windows'
272+
shell: msys2 {0}
273+
run: |
274+
echo "📦 Packaging Windows prebuilt binaries..."
245275
mkdir -p prebuilds/win32-x64
246276
247-
# 复制.node扩展
277+
# 复制.node扩展(MSVC构建)
248278
cp build/Release/wsjtx_lib_nodejs.node prebuilds/win32-x64/
279+
echo "✅ Copied .node extension (MSVC)"
249280
250-
# 复制bridge动态库
251-
cp build/Release/wsjtx_bridge.dll prebuilds/win32-x64/
281+
# 复制wsjtx_bridge.dll(MinGW构建)
282+
cp build_mingw/Release/wsjtx_bridge.dll prebuilds/win32-x64/
283+
echo "✅ Copied wsjtx_bridge.dll (MinGW)"
252284
253285
# 复制MinGW运行时依赖
254286
echo "📦 Copying MinGW runtime dependencies..."
@@ -469,10 +501,17 @@ jobs:
469501
echo "📁 构建完成的文件:"
470502
ls -la "$TARGET_DIR"
471503
472-
# 计算文件数量
473-
BRIDGE_LIBS=$(ls "$TARGET_DIR" | grep -E "\\.(so|dylib)$" | grep -v wsjtx_bridge | wc -l)
474-
NODE_SIZE=$(stat -c%s "$TARGET_DIR"/*.node 2>/dev/null || stat -f%z "$TARGET_DIR"/*.node 2>/dev/null || echo "unknown")
475-
BRIDGE_SIZE=$(stat -c%s "$TARGET_DIR"/wsjtx_bridge.* 2>/dev/null || stat -f%z "$TARGET_DIR"/wsjtx_bridge.* 2>/dev/null || echo "unknown")
504+
# 计算文件数量(去除空格)
505+
BRIDGE_LIBS=$(ls "$TARGET_DIR" | grep -E "\\.(so|dylib)$" | grep -v wsjtx_bridge | wc -l | tr -d ' ')
506+
507+
# 获取文件大小(确保是数字或引号包裹的字符串)
508+
if [ "${{ runner.os }}" = "Linux" ]; then
509+
NODE_SIZE=$(stat -c%s "$TARGET_DIR"/*.node 2>/dev/null || echo "0")
510+
BRIDGE_SIZE=$(stat -c%s "$TARGET_DIR"/wsjtx_bridge.* 2>/dev/null || echo "0")
511+
else
512+
NODE_SIZE=$(stat -f%z "$TARGET_DIR"/*.node 2>/dev/null || echo "0")
513+
BRIDGE_SIZE=$(stat -f%z "$TARGET_DIR"/wsjtx_bridge.* 2>/dev/null || echo "0")
514+
fi
476515
477516
# 创建构建信息文件
478517
cat > "$TARGET_DIR/build-info.json" << EOF

0 commit comments

Comments
 (0)