🐛 fix(ci): 修复 DuckDB Windows 导入库生成链路

- 改为从 duckdb.dll 生成 MinGW 可用的导入库文件
- 同步修复 dev/release workflow 与本机源码构建的 DuckDB Windows 依赖准备逻辑
- 新增导入库生成命令与 buildutil 单测
This commit is contained in:
Syngnat
2026-06-08 17:59:58 +08:00
parent 2e5c3473e1
commit a54a357e4b
6 changed files with 314 additions and 25 deletions

View File

@@ -381,6 +381,7 @@ jobs:
update: true
install: >-
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-binutils
- name: Configure DuckDB CGO Toolchain (Windows AMD64)
if: ${{ matrix.platform == 'windows/amd64' }}
@@ -546,14 +547,14 @@ jobs:
local lib_dir="$RUNNER_TEMP/duckdb-windows-${DUCKDB_WINDOWS_LIBRARY_VERSION}"
local extract_dir="$RUNNER_TEMP/duckdb-windows-extract-${DUCKDB_WINDOWS_LIBRARY_VERSION}"
local zip_path="$RUNNER_TEMP/libduckdb-windows-amd64.zip"
if [ -f "$lib_dir/duckdb.dll" ] && [ -f "$lib_dir/duckdb.lib" ]; then
if [ -f "$lib_dir/duckdb.dll" ] && [ -f "$lib_dir/libduckdb.dll.a" ] && [ -f "$lib_dir/libduckdb.a" ]; then
echo "$lib_dir"
return 0
fi
mkdir -p "$lib_dir"
rm -rf "$extract_dir"
rm -f "$zip_path"
local attempt dll_path lib_path
local attempt dll_path
for attempt in 1 2 3; do
echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}"
if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then
@@ -564,17 +565,17 @@ jobs:
mkdir -p "$extract_dir"
unzip -qo "$zip_path" -d "$extract_dir"
dll_path="$(find "$extract_dir" -type f -name duckdb.dll | head -n 1 || true)"
lib_path="$(find "$extract_dir" -type f -name duckdb.lib | head -n 1 || true)"
if [ -n "$dll_path" ] && [ -n "$lib_path" ]; then
if [ -n "$dll_path" ]; then
cp "$dll_path" "$lib_dir/duckdb.dll"
cp "$lib_path" "$lib_dir/duckdb.lib"
cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a"
cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a"
go run ./cmd/mingw-import-lib \
--dll "$lib_dir/duckdb.dll" \
--output-lib "$lib_dir/libduckdb.dll.a"
cp "$lib_dir/libduckdb.dll.a" "$lib_dir/libduckdb.a"
rm -rf "$extract_dir"
echo "$lib_dir"
return 0
fi
echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll 或 duckdb.lib,准备重试"
echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll准备重试"
else
echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试"
fi

View File

@@ -390,6 +390,7 @@ jobs:
update: true
install: >-
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-binutils
- name: Configure DuckDB CGO Toolchain (Windows AMD64)
if: ${{ matrix.platform == 'windows/amd64' }}
@@ -544,14 +545,14 @@ jobs:
local lib_dir="$RUNNER_TEMP/duckdb-windows-${DUCKDB_WINDOWS_LIBRARY_VERSION}"
local extract_dir="$RUNNER_TEMP/duckdb-windows-extract-${DUCKDB_WINDOWS_LIBRARY_VERSION}"
local zip_path="$RUNNER_TEMP/libduckdb-windows-amd64.zip"
if [ -f "$lib_dir/duckdb.dll" ] && [ -f "$lib_dir/duckdb.lib" ]; then
if [ -f "$lib_dir/duckdb.dll" ] && [ -f "$lib_dir/libduckdb.dll.a" ] && [ -f "$lib_dir/libduckdb.a" ]; then
echo "$lib_dir"
return 0
fi
mkdir -p "$lib_dir"
rm -rf "$extract_dir"
rm -f "$zip_path"
local attempt dll_path lib_path
local attempt dll_path
for attempt in 1 2 3; do
echo "📥 下载 DuckDB Windows 动态库 (${attempt}/3): ${DUCKDB_WINDOWS_LIBRARY_URL}"
if curl --retry 3 --retry-delay 2 --retry-all-errors --connect-timeout 20 --max-time 300 -fsSL "$DUCKDB_WINDOWS_LIBRARY_URL" -o "$zip_path"; then
@@ -562,17 +563,17 @@ jobs:
mkdir -p "$extract_dir"
unzip -qo "$zip_path" -d "$extract_dir"
dll_path="$(find "$extract_dir" -type f -name duckdb.dll | head -n 1 || true)"
lib_path="$(find "$extract_dir" -type f -name duckdb.lib | head -n 1 || true)"
if [ -n "$dll_path" ] && [ -n "$lib_path" ]; then
if [ -n "$dll_path" ]; then
cp "$dll_path" "$lib_dir/duckdb.dll"
cp "$lib_path" "$lib_dir/duckdb.lib"
cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.dll.a"
cp "$lib_dir/duckdb.lib" "$lib_dir/libduckdb.a"
go run ./cmd/mingw-import-lib \
--dll "$lib_dir/duckdb.dll" \
--output-lib "$lib_dir/libduckdb.dll.a"
cp "$lib_dir/libduckdb.dll.a" "$lib_dir/libduckdb.a"
rm -rf "$extract_dir"
echo "$lib_dir"
return 0
fi
echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll 或 duckdb.lib,准备重试"
echo "⚠️ DuckDB Windows 动态库压缩包缺少 duckdb.dll准备重试"
else
echo "⚠️ DuckDB Windows 动态库压缩包校验失败,准备重试"
fi