#!/usr/bin/env bash # Сборка ФИАС_поиск.exe на Linux через Wine (32-bit Python 3.8 for Windows) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PYTHON_VERSION="3.8.10" PYTHON_URL="https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}.exe" PYTHON_INSTALLER="${SCRIPT_DIR}/python-${PYTHON_VERSION}-win32.exe" export WINEARCH=win32 export WINEPREFIX="${HOME}/.wine_fias32" export WINEDEBUG=-all # подавить лишние логи Wine WINE_PYTHON="wine ${WINEPREFIX}/drive_c/Python38/python.exe" # ─── 1. Wine ──────────────────────────────────────────────────────────────── if ! command -v wine &>/dev/null; then echo ">>> Установка Wine..." sudo apt-get update -q sudo apt-get install -y wine wine32 else echo ">>> Wine $(wine --version)" fi # ─── 2. Wine prefix (32-bit) ──────────────────────────────────────────────── if [ ! -d "${WINEPREFIX}" ]; then echo ">>> Создание 32-bit Wine prefix..." wineboot --init 2>/dev/null # Подождать инициализации sleep 4 fi # ─── 3. Python 3.8.10 32-bit ──────────────────────────────────────────────── PYTHON_EXE="${WINEPREFIX}/drive_c/Python38/python.exe" if [ ! -f "${PYTHON_EXE}" ]; then if [ ! -f "${PYTHON_INSTALLER}" ]; then echo ">>> Скачивание Python ${PYTHON_VERSION} (win32)..." wget -q --show-progress "${PYTHON_URL}" -O "${PYTHON_INSTALLER}" fi echo ">>> Установка Python в Wine..." wine "${PYTHON_INSTALLER}" \ /quiet \ InstallAllUsers=0 \ PrependPath=0 \ Include_launcher=0 \ TargetDir="C:\\Python38" sleep 5 echo ">>> Python установлен: ${PYTHON_EXE}" else echo ">>> Python уже установлен" fi # ─── 4. pip + зависимости ─────────────────────────────────────────────────── echo ">>> Обновление pip..." ${WINE_PYTHON} -m pip install --upgrade pip --quiet echo ">>> Установка зависимостей..." ${WINE_PYTHON} -m pip install \ "selenium>=4.15,<5" \ "webdriver-manager>=4,<5" \ "openpyxl>=3.1,<4" \ "pdfplumber>=0.10,<1" \ "requests>=2.31,<3" \ "pyinstaller>=5.13,<7" \ --quiet # ─── 5. PyInstaller ───────────────────────────────────────────────────────── echo ">>> Сборка .exe ..." cd "${SCRIPT_DIR}" # Очистка rm -rf build dist *.spec ${WINE_PYTHON} -m PyInstaller \ --onefile \ --noconsole \ --name "ФИАС_поиск" \ --collect-all selenium \ --collect-all webdriver_manager \ --collect-all pdfplumber \ --collect-all pdfminer \ --collect-all openpyxl \ --collect-all certifi \ --hidden-import selenium.webdriver.firefox.webdriver \ --hidden-import selenium.webdriver.firefox.options \ --hidden-import selenium.webdriver.firefox.service \ --hidden-import selenium.webdriver.support.expected_conditions \ --hidden-import selenium.webdriver.common.by \ --hidden-import webdriver_manager.firefox \ --hidden-import pdfminer.high_level \ --hidden-import pdfminer.converter \ --hidden-import pdfminer.layout \ --hidden-import pdfminer.pdfpage \ --hidden-import pdfminer.pdfinterp \ --hidden-import pdfminer.pdffont \ --hidden-import pdfminer.pdftypes \ --hidden-import pdfminer.pdfparser \ --hidden-import pdfminer.pdfdevice \ --hidden-import openpyxl.styles \ --hidden-import openpyxl.utils \ --hidden-import cryptography \ --hidden-import tkinter \ --hidden-import tkinter.filedialog \ --hidden-import tkinter.scrolledtext \ --hidden-import tkinter.messagebox \ --hidden-import queue \ --hidden-import logging \ --hidden-import platform \ main.py # ─── 6. Результат ─────────────────────────────────────────────────────────── EXE="${SCRIPT_DIR}/dist/ФИАС_поиск.exe" if [ -f "${EXE}" ]; then SIZE=$(du -sh "${EXE}" | cut -f1) echo "" echo "╔══════════════════════════════════════════════╗" echo " Готово! dist/ФИАС_поиск.exe (${SIZE})" echo " Firefox должен быть установлен на Windows." echo " geckodriver скачается при первом запуске." echo "╚══════════════════════════════════════════════╝" else echo "ОШИБКА: .exe не создан" exit 1 fi