From fd934cc3af4c558d8e48654c6ea1db7acac1fbba Mon Sep 17 00:00:00 2001 From: Samuel Veiga Rangel Date: Tue, 30 Jun 2026 12:07:18 -0300 Subject: [PATCH 1/2] fix script build linux --- spsvalidator/packaging/build_linux.sh | 53 ++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) mode change 100644 => 100755 spsvalidator/packaging/build_linux.sh diff --git a/spsvalidator/packaging/build_linux.sh b/spsvalidator/packaging/build_linux.sh old mode 100644 new mode 100755 index b235689..5af9a7b --- a/spsvalidator/packaging/build_linux.sh +++ b/spsvalidator/packaging/build_linux.sh @@ -4,19 +4,62 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" -python -m pip install -e ".[dev]" +VENV_DIR="${ROOT_DIR}/.venv" +_ensure_build_venv() { + if [[ -d "$VENV_DIR" ]] && ! "$VENV_DIR/bin/python" -c "import gi" >/dev/null 2>&1; then + rm -rf "$VENV_DIR" + fi + if [[ ! -d "$VENV_DIR" ]]; then + python3 -m venv --system-site-packages "$VENV_DIR" + fi +} + +if [[ -z "${VIRTUAL_ENV:-}" ]]; then + _ensure_build_venv + # shellcheck source=/dev/null + source "$VENV_DIR/bin/activate" +fi + +if ! python -c "import gi" >/dev/null 2>&1; then + echo "Missing GTK bindings (gi). Install system packages and rebuild:" >&2 + echo " sudo apt install python3-gi python3-gi-cairo gir1.2-webkit-6.0" >&2 + exit 1 +fi + +python -m pip install -e . python -m pip install pyinstaller -pyinstaller --noconfirm --windowed \ + +# Remove old onedir output so the onefile binary can use dist/spsvalidator. +rm -rf build/spsvalidator dist/spsvalidator spsvalidator.spec + +pyinstaller --noconfirm --clean --onefile --windowed \ --name spsvalidator \ --icon src/spsvalidator/web/static/img/icon.png \ --paths src \ - --collect-all packtools \ - --collect-all webview \ + --collect-data packtools \ --collect-data spsvalidator \ --hidden-import pkg_resources \ --hidden-import requests \ --hidden-import tenacity \ --hidden-import langdetect \ + --hidden-import gi \ + --hidden-import gi.repository \ + --hidden-import gi.repository.Gtk \ + --hidden-import gi.repository.WebKit2 \ + --hidden-import webview.platforms.gtk \ + --exclude-module webview.platforms.qt \ + --exclude-module webview.platforms.android \ + --exclude-module webview.platforms.cocoa \ + --exclude-module webview.platforms.winforms \ + --exclude-module webview.platforms.edgechromium \ + --exclude-module qtpy \ + --exclude-module PyQt6 \ + --exclude-module PySide6 \ + --exclude-module black \ + --exclude-module pytest \ + --exclude-module isort \ --copy-metadata setuptools \ src/spsvalidator/main.py -echo "Use linuxdeploy/appimagetool to convert dist/spsvalidator into AppImage." + +echo "Linux executable generated at dist/spsvalidator." +echo "Use linuxdeploy/appimagetool to convert it into AppImage." From ca93290dc8feed190d0b511105b32f1e1ff9bbae Mon Sep 17 00:00:00 2001 From: Samuel Veiga Rangel Date: Wed, 1 Jul 2026 10:58:38 -0300 Subject: [PATCH 2/2] - Add spec - Altera script para funcionar com interfaces GTK e QT --- .gitignore | 2 +- spsvalidator/packaging/build_linux.sh | 51 +++++------- .../src/spsvalidator/spsvalidator_linux.spec | 83 +++++++++++++++++++ 3 files changed, 103 insertions(+), 33 deletions(-) mode change 100755 => 100644 spsvalidator/packaging/build_linux.sh create mode 100644 spsvalidator/src/spsvalidator/spsvalidator_linux.spec diff --git a/.gitignore b/.gitignore index 83972fa..4aaf63b 100644 --- a/.gitignore +++ b/.gitignore @@ -30,7 +30,7 @@ MANIFEST # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest -*.spec + # Installer logs pip-log.txt diff --git a/spsvalidator/packaging/build_linux.sh b/spsvalidator/packaging/build_linux.sh old mode 100755 new mode 100644 index 5af9a7b..f5f7673 --- a/spsvalidator/packaging/build_linux.sh +++ b/spsvalidator/packaging/build_linux.sh @@ -4,6 +4,8 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" cd "$ROOT_DIR" +SPEC_FILE="${ROOT_DIR}/src/spsvalidator/spsvalidator_linux.spec" + VENV_DIR="${ROOT_DIR}/.venv" _ensure_build_venv() { if [[ -d "$VENV_DIR" ]] && ! "$VENV_DIR/bin/python" -c "import gi" >/dev/null 2>&1; then @@ -22,44 +24,29 @@ fi if ! python -c "import gi" >/dev/null 2>&1; then echo "Missing GTK bindings (gi). Install system packages and rebuild:" >&2 - echo " sudo apt install python3-gi python3-gi-cairo gir1.2-webkit-6.0" >&2 + echo " sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-webkit-6.0" >&2 exit 1 fi python -m pip install -e . -python -m pip install pyinstaller +python -m pip install "pywebview[qt]" pyinstaller + +if ! python -c "import webview.platforms.qt" >/dev/null 2>&1; then + echo "Missing Qt backend for pywebview. Install system packages and rebuild:" >&2 + echo " sudo apt install python3-pyqt6 python3-pyqt6.qtwebengine" >&2 + exit 1 +fi + +if [[ ! -f "$SPEC_FILE" ]]; then + echo "Spec file not found: $SPEC_FILE" >&2 + exit 1 +fi -# Remove old onedir output so the onefile binary can use dist/spsvalidator. -rm -rf build/spsvalidator dist/spsvalidator spsvalidator.spec +# Remove old output so the binary can use dist/spsvalidator. +rm -rf build/spsvalidator dist/spsvalidator -pyinstaller --noconfirm --clean --onefile --windowed \ - --name spsvalidator \ - --icon src/spsvalidator/web/static/img/icon.png \ - --paths src \ - --collect-data packtools \ - --collect-data spsvalidator \ - --hidden-import pkg_resources \ - --hidden-import requests \ - --hidden-import tenacity \ - --hidden-import langdetect \ - --hidden-import gi \ - --hidden-import gi.repository \ - --hidden-import gi.repository.Gtk \ - --hidden-import gi.repository.WebKit2 \ - --hidden-import webview.platforms.gtk \ - --exclude-module webview.platforms.qt \ - --exclude-module webview.platforms.android \ - --exclude-module webview.platforms.cocoa \ - --exclude-module webview.platforms.winforms \ - --exclude-module webview.platforms.edgechromium \ - --exclude-module qtpy \ - --exclude-module PyQt6 \ - --exclude-module PySide6 \ - --exclude-module black \ - --exclude-module pytest \ - --exclude-module isort \ - --copy-metadata setuptools \ - src/spsvalidator/main.py +pyinstaller --noconfirm --clean "$SPEC_FILE" echo "Linux executable generated at dist/spsvalidator." +echo "GTK and Qt backends are bundled; runtime still needs system GTK or Qt libraries." echo "Use linuxdeploy/appimagetool to convert it into AppImage." diff --git a/spsvalidator/src/spsvalidator/spsvalidator_linux.spec b/spsvalidator/src/spsvalidator/spsvalidator_linux.spec new file mode 100644 index 0000000..50fb1c6 --- /dev/null +++ b/spsvalidator/src/spsvalidator/spsvalidator_linux.spec @@ -0,0 +1,83 @@ +# -*- mode: python ; coding: utf-8 -*- +import os + +from PyInstaller.utils.hooks import collect_all, collect_data_files, copy_metadata + +project_root = os.path.abspath(os.path.join(SPECPATH, "..", "..")) +main_script = os.path.join(project_root, "src", "spsvalidator", "main.py") +src_path = os.path.join(project_root, "src") +icon_path = os.path.join( + project_root, "src", "spsvalidator", "web", "static", "img", "icon.png" +) + +datas = [] +binaries = [] +hiddenimports = [ + "pkg_resources", + "requests", + "tenacity", + "langdetect", + "gi", + "gi.repository", + "gi.repository.Gtk", + "gi.repository.WebKit2", + "webview.platforms.gtk", + "webview.platforms.qt", +] +datas += collect_data_files("packtools") +datas += collect_data_files("spsvalidator") +datas += copy_metadata("setuptools") +tmp_ret = collect_all("webview") +datas += tmp_ret[0] +binaries += tmp_ret[1] +hiddenimports += tmp_ret[2] + +a = Analysis( + [main_script], + pathex=[src_path], + binaries=binaries, + datas=datas, + hiddenimports=hiddenimports, + hookspath=[], + hooksconfig={ + "gi": { + "icons": ["hicolor"], + "themes": [], + } + }, + runtime_hooks=[], + excludes=[ + "webview.platforms.android", + "webview.platforms.cocoa", + "webview.platforms.winforms", + "webview.platforms.edgechromium", + "black", + "pytest", + "isort", + ], + noarchive=False, + optimize=0, +) +pyz = PYZ(a.pure) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.datas, + [], + name="spsvalidator", + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, + icon=[icon_path], +)