#!/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