Files
diskmanager2/build.sh
2026-02-09 21:58:27 +08:00

114 lines
3.2 KiB
Bash

#!/bin/bash
#
# Linux 存储管理器 - PyInstaller 打包脚本 (简化版)
# 直接打包,仅保留 dist 目录中的最终文件
#
set -e
# 确定主文件
MAIN_SCRIPT="mainwindow_tkinter.py"
if [ ! -f "$MAIN_SCRIPT" ]; then
MAIN_SCRIPT="mainwindow.py"
fi
# 检查 tkinter
if ! python3 -c "import tkinter" 2>/dev/null; then
echo "错误: 未找到 tkinter 模块"
exit 1
fi
# 获取 tkinter 路径
TKINTER_INFO=$(python3 << 'EOF'
import tkinter
import os
import sys
tcl = tkinter.Tcl()
tk_version = tcl.call("info", "tclversion")
tk_lib = tcl.call("info", "library")
print(f"TK_VERSION:{tk_version}")
print(f"TK_LIBRARY:{tk_lib}")
tkinter_file = tkinter.__file__
print(f"TKINTER_FILE:{tkinter_file}")
tcl_lib = os.path.dirname(tk_lib)
print(f"TCL_LIBRARY:{tcl_lib}")
import sysconfig
lib_dynload = os.path.join(sysconfig.get_config_var('LIBDIR'), f"python{sys.version_info.major}.{sys.version_info.minor}", "lib-dynload")
if not os.path.exists(lib_dynload):
lib_dynload = os.path.join(sysconfig.get_config_var('LIBDIR'), "lib-dynload")
print(f"LIB_DYNLOAD:{lib_dynload}")
EOF
)
TK_VERSION=$(echo "$TKINTER_INFO" | grep "TK_VERSION:" | cut -d: -f2)
TK_LIBRARY=$(echo "$TKINTER_INFO" | grep "TK_LIBRARY:" | cut -d: -f2)
TCL_LIBRARY=$(echo "$TKINTER_INFO" | grep "TCL_LIBRARY:" | cut -d: -f2)
LIB_DYNLOAD=$(echo "$TKINTER_INFO" | grep "LIB_DYNLOAD:" | cut -d: -f2)
PYTHON_VERSION=$(python3 -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')
# 查找 _tkinter 共享库
TKINTER_SO=""
for pattern in "_tkinter.cpython-${PYTHON_VERSION//./}m-x86_64-linux-gnu.so" "_tkinter.cpython-${PYTHON_VERSION//./}-x86_64-linux-gnu.so" "_tkinter.so"; do
if [ -f "$LIB_DYNLOAD/$pattern" ]; then
TKINTER_SO="$LIB_DYNLOAD/$pattern"
break
fi
done
if [ -z "$TKINTER_SO" ]; then
TKINTER_SO=$(find $LIB_DYNLOAD -name "_tkinter*.so" 2>/dev/null | head -1)
fi
# 构建 PyInstaller 参数
PYINSTALLER_ARGS=(
--onefile
--name "linux-storage-manager"
--clean
--noconfirm
--console
--hidden-import "tkinter"
--hidden-import "tkinter.ttk"
--hidden-import "tkinter.scrolledtext"
--hidden-import "tkinter.messagebox"
--hidden-import "tkinter.filedialog"
--hidden-import "tkinter.simpledialog"
--hidden-import "_tkinter"
)
# 添加 tkinter 库文件
if [ -n "$TKINTER_SO" ]; then
PYINSTALLER_ARGS+=(--add-binary "$TKINTER_SO:.")
fi
if [ -d "$TCL_LIBRARY" ]; then
PYINSTALLER_ARGS+=(--add-data "$TCL_LIBRARY:tcl")
fi
if [ -d "$TK_LIBRARY" ]; then
PYINSTALLER_ARGS+=(--add-data "$TK_LIBRARY:tk")
fi
# 查找并添加其他 Tcl/Tk 文件
for dir in /usr/lib64/tcl$TK_VERSION /usr/lib/tcl$TK_VERSION /usr/share/tcltk /usr/lib/tcltk /usr/lib64/tcltk; do
if [ -d "$dir" ]; then
PYINSTALLER_ARGS+=(--add-data "$dir:tcltk")
fi
done
# 执行打包
python3 -m PyInstaller "${PYINSTALLER_ARGS[@]}" "$MAIN_SCRIPT"
# 检查结果
if [ -f "dist/linux-storage-manager" ]; then
SIZE=$(du -h dist/linux-storage-manager | cut -f1)
echo ""
echo "打包成功!"
echo " 输出文件: dist/linux-storage-manager"
echo " 文件大小: $SIZE"
echo " 运行命令: sudo dist/linux-storage-manager"
else
echo "打包失败"
exit 1
fi