Files
kadastr-nalog/build_wine.sh
2026-06-01 17:04:41 +05:00

136 lines
5.7 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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
# Портативный Firefox + geckodriver включаем, только если папка vendor наполнена.
VENDOR_ARG=()
if [ -d vendor ] && [ -n "$(ls -A vendor 2>/dev/null)" ]; then
VENDOR_ARG=(--add-data "vendor;vendor")
echo ">>> vendor/ включён в сборку"
else
echo ">>> ВНИМАНИЕ: vendor/ пуст — Firefox и geckodriver НЕ встроятся. Запустите: python fetch_vendor.py"
fi
${WINE_PYTHON} -m PyInstaller \
--onefile \
--noconsole \
--name "ФИАС_поиск" \
--add-data "extensions;extensions" \
"${VENDOR_ARG[@]}" \
--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