Files
diskmanager2/build-compat.sh
2026-02-10 02:54:13 +08:00

217 lines
5.3 KiB
Bash
Executable File

#!/bin/bash
# Linux 存储管理器 - 跨平台构建脚本 (Tkinter 版本)
# 支持 Arch Linux 和 CentOS/RHEL 8
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 脚本目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
echo "========================================"
echo "Linux 存储管理器 - 跨平台构建 (Tkinter)"
echo "========================================"
# 检测操作系统
detect_os() {
if [ -f /etc/os-release ]; then
. /etc/os-release
OS=$NAME
VER=$VERSION_ID
elif type lsb_release >/dev/null 2>&1; then
OS=$(lsb_release -si)
VER=$(lsb_release -sr)
else
OS=$(uname -s)
VER=$(uname -r)
fi
echo -e "${GREEN}检测到系统: $OS $VER${NC}"
}
# 检查 Python 版本
check_python() {
if command -v python3 &> /dev/null; then
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
echo -e "${GREEN}Python版本: $PYTHON_VERSION${NC}"
# 检查 tkinter
if python3 -c "import tkinter" 2>/dev/null; then
echo -e "${GREEN}Tkinter 已安装${NC}"
else
echo -e "${RED}错误: 未找到 Tkinter${NC}"
echo -e "${YELLOW}请先安装 tkinter:${NC}"
echo " CentOS 8: sudo yum install python3-tkinter"
echo " Arch Linux: sudo pacman -S tk"
exit 1
fi
else
echo -e "${RED}错误: 未找到 Python3${NC}"
exit 1
fi
}
# 安装依赖
install_deps() {
echo ""
echo "检查依赖..."
if [[ "$OS" == *"CentOS"* ]] || [[ "$OS" == *"Red Hat"* ]] || [[ "$OS" == *"RHEL"* ]]; then
echo -e "${YELLOW}为 CentOS/RHEL 安装依赖...${NC}"
# 检查是否为 root
if [ "$EUID" -ne 0 ]; then
SUDO="sudo"
else
SUDO=""
fi
# 安装系统依赖
$SUDO yum install -y python3 python3-tkinter parted mdadm lvm2 || true
$SUDO yum install -y dosfstools e2fsprogs xfsprogs ntfs-3g || true
# 安装 Python 依赖
pip3 install pexpect --user || true
elif [[ "$OS" == *"Arch"* ]]; then
echo -e "${YELLOW}为 Arch Linux 安装依赖...${NC}"
if [ "$EUID" -ne 0 ]; then
SUDO="sudo"
else
SUDO=""
fi
# 安装系统依赖
$SUDO pacman -Sy --needed python tk parted mdadm lvm2 || true
$SUDO pacman -Sy --needed dosfstools e2fsprogs xfsprogs ntfs-3g || true
# 安装 Python 依赖
pip3 install pexpect --user || true
else
echo -e "${YELLOW}未知系统,尝试通用安装...${NC}"
pip3 install pexpect --user || true
fi
}
# 检查 PyInstaller
check_pyinstaller() {
if ! command -v pyinstaller &> /dev/null; then
echo -e "${YELLOW}安装 PyInstaller...${NC}"
pip3 install pyinstaller --user
fi
# 将用户 bin 目录添加到 PATH
export PATH="$HOME/.local/bin:$PATH"
}
# 测试运行
test_run() {
echo ""
echo "测试运行..."
python3 main.py --help 2>/dev/null || echo "测试跳过"
}
# 构建
build() {
echo ""
echo "========================================"
echo "开始构建..."
echo "========================================"
# 清理旧构建
rm -rf build dist
# 使用兼容的 spec 文件
if [ -f "disk-manager-compat.spec" ]; then
SPEC_FILE="disk-manager-compat.spec"
else
echo -e "${RED}错误: 找不到 disk-manager-compat.spec${NC}"
exit 1
fi
echo -e "${GREEN}使用 spec 文件: $SPEC_FILE${NC}"
# 执行构建
pyinstaller --clean -F "$SPEC_FILE"
if [ $? -eq 0 ]; then
echo ""
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN}构建成功!${NC}"
echo -e "${GREEN}输出: dist/disk-manager${NC}"
echo -e "${GREEN}========================================${NC}"
# 显示文件信息
if [ -f "dist/disk-manager" ]; then
ls -lh dist/disk-manager
fi
else
echo -e "${RED}构建失败!${NC}"
exit 1
fi
}
# 创建启动脚本
create_launcher() {
echo ""
echo "创建启动脚本..."
cat > run.sh << 'EOF'
#!/bin/bash
# Linux 存储管理器启动脚本
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
if [ -f "$SCRIPT_DIR/dist/disk-manager" ]; then
# 打包版本
exec "$SCRIPT_DIR/dist/disk-manager" "$@"
elif [ -f "$SCRIPT_DIR/main.py" ]; then
# 源码版本
exec python3 "$SCRIPT_DIR/main.py" "$@"
else
echo "错误: 找不到 disk-manager 或 main.py"
exit 1
fi
EOF
chmod +x run.sh
echo -e "${GREEN}创建 run.sh 成功${NC}"
}
# 主函数
main() {
detect_os
check_python
# 询问是否安装依赖
echo ""
read -p "是否安装系统依赖? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
install_deps
fi
check_pyinstaller
# 询问是否测试
echo ""
read -p "是否先测试运行? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
test_run
fi
# 构建
build
create_launcher
}
# 运行主函数
main