попытка перехода на python 3.12 и nutika для компиляции без зависимостей
This commit is contained in:
@@ -1,34 +1,119 @@
|
||||
import subprocess
|
||||
import shutil
|
||||
import os
|
||||
import PySide6
|
||||
|
||||
# Пути
|
||||
dist_path = os.path.abspath("./") # текущая папка — exe будет тут
|
||||
work_path = os.path.abspath("./build_temp")
|
||||
spec_path = os.path.abspath("./build_temp")
|
||||
USE_NUITKA = True # переключатель: True — сборка через Nuitka, False — через PyInstaller
|
||||
|
||||
pyside6_path = os.path.dirname(PySide6.__file__)
|
||||
plugins_platforms_path = os.path.join(pyside6_path, "plugins", "platforms")
|
||||
|
||||
dist_path = os.path.abspath(".") # итоговая папка с exe
|
||||
work_path = os.path.abspath("./build_temp") # временная папка для PyInstaller
|
||||
spec_path = os.path.abspath("./build_temp") # папка exдля spec-файлов PyInstaller
|
||||
script_dir = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
libclang_path = os.path.join(script_dir, "libclang.dll")
|
||||
libssl_orig = os.path.join(script_dir, "libssl-3-x64.dll")
|
||||
libcrypto_orig = os.path.join(script_dir, "libcrypto-3-x64.dll")
|
||||
|
||||
# Запуск PyInstaller с нужными параметрами
|
||||
cmd = [
|
||||
"pyinstaller",
|
||||
"--onefile",
|
||||
"--windowed",
|
||||
"--name", "DebugVarEdit",
|
||||
"--add-binary", f"{libclang_path};.",
|
||||
"--distpath", dist_path,
|
||||
"--workpath", work_path,
|
||||
"--specpath", spec_path,
|
||||
"./Src/setupVars_GUI.py"
|
||||
]
|
||||
# Собираем бинарники и данные для PyInstaller
|
||||
add_binary_list = [f"{libclang_path};."]
|
||||
|
||||
if os.path.exists(libssl_orig):
|
||||
add_binary_list.append(f"{libssl_orig};libssl.dll")
|
||||
else:
|
||||
print("WARNING: libssl-3-x64.dll не найден, OpenSSL не будет включён")
|
||||
|
||||
if os.path.exists(libcrypto_orig):
|
||||
add_binary_list.append(f"{libcrypto_orig};libcrypto.dll")
|
||||
else:
|
||||
print("WARNING: libcrypto-3-x64.dll не найден, OpenSSL не будет включён")
|
||||
|
||||
from PyInstaller.utils.hooks import collect_data_files
|
||||
datas = []
|
||||
datas += collect_data_files('PySide6', includes=['plugins/platforms/*'])
|
||||
datas += collect_data_files('PySide6', includes=['plugins/styles/*'])
|
||||
datas += collect_data_files('PySide6', includes=['plugins/imageformats/*'])
|
||||
add_data_list = [f"{src};{dest}" for src, dest in datas]
|
||||
|
||||
script_path = "./Src/setupVars_GUI.py"
|
||||
output_name = "DebugVarEdit"
|
||||
|
||||
env = os.environ.copy()
|
||||
env["CC"] = r"C:\Users\I\AppData\Local\Nuitka\Nuitka\Cache\DOWNLOADS\gcc\x86_64\14.2.0posix-19.1.1-12.0.0-msvcrt-r2\bin\gcc.exe"
|
||||
env["CXX"] = r"C:\Users\I\AppData\Local\Nuitka\Nuitka\Cache\DOWNLOADS\gcc\x86_64\14.2.0posix-19.1.1-12.0.0-msvcrt-r2\bin\g++.exe"
|
||||
|
||||
if not USE_NUITKA:
|
||||
# PyInstaller команда
|
||||
cmd = [
|
||||
"pyinstaller",
|
||||
"--onefile",
|
||||
"--name", output_name,
|
||||
*[item for add_bin in add_binary_list for item in ("--add-binary", add_bin)],
|
||||
*[item for add_dat in add_data_list for item in ("--add-data", add_dat)],
|
||||
"--distpath", dist_path,
|
||||
"--workpath", work_path,
|
||||
"--specpath", spec_path,
|
||||
"--hidden-import", "PySide6.QtWidgets",
|
||||
"--hidden-import", "PySide6.QtGui",
|
||||
"--hidden-import", "PySide6.QtCore",
|
||||
"--windowed",
|
||||
script_path
|
||||
]
|
||||
else:
|
||||
# Nuitka команда
|
||||
|
||||
|
||||
# Формируем --include-data-dir для плагинов PySide6 (datas как в PyInstaller)
|
||||
# Было — неправильный способ: передаёт файлы
|
||||
plugin_dirs = set()
|
||||
for src, dest in datas:
|
||||
src_dir = os.path.dirname(src)
|
||||
dest_root = dest.split("/", 1)[0] if "/" in dest else dest
|
||||
plugin_dirs.add((src_dir, dest_root))
|
||||
|
||||
include_data_dirs = [
|
||||
f"--include-data-dir={src}={dest}" for src, dest in plugin_dirs
|
||||
]
|
||||
|
||||
include_data_files = []
|
||||
for dll_path, dll_name in [(libclang_path, "libclang.dll"),
|
||||
(libssl_orig, "libssl.dll"),
|
||||
(libcrypto_orig, "libcrypto.dll")]:
|
||||
if os.path.exists(dll_path):
|
||||
include_data_files.append(f"--include-data-file={dll_path}={dll_name}")
|
||||
|
||||
|
||||
cmd = [
|
||||
"python", "-m", "nuitka",
|
||||
"--standalone", # полностью независимый билд (аналог PyInstaller --onefile/--onedir)
|
||||
"--onefile", # упаковать в один exe (экспериментально)
|
||||
"--enable-plugin=pyside6",
|
||||
"--windows-console-mode=disable",
|
||||
f"--output-dir={dist_path}",
|
||||
f"--output-filename={output_name}.exe",
|
||||
] + include_data_dirs + [
|
||||
script_path
|
||||
]
|
||||
|
||||
# Удаляем временные папки, если они у тебя есть
|
||||
temp_dirs = ["build_temp", "__pycache__"] # добавь свои папки с временными файлами
|
||||
for d in temp_dirs:
|
||||
if os.path.exists(d):
|
||||
shutil.rmtree(d)
|
||||
|
||||
print("Выполняется сборка:")
|
||||
print(" ".join(cmd))
|
||||
|
||||
result = subprocess.run(cmd, env=env)
|
||||
|
||||
result = subprocess.run(cmd)
|
||||
if result.returncode == 0:
|
||||
# Удаляем временные папки
|
||||
for folder in ["build_temp", "__pycache__"]:
|
||||
if os.path.exists(folder):
|
||||
shutil.rmtree(folder)
|
||||
|
||||
# Чистим временные папки, только для PyInstaller (для Nuitka обычно не нужно)
|
||||
if not USE_NUITKA:
|
||||
for folder in ["build_temp", "__pycache__"]:
|
||||
if os.path.exists(folder):
|
||||
shutil.rmtree(folder)
|
||||
print("Сборка успешно завершена!")
|
||||
else:
|
||||
print("Сборка завершилась с ошибкой.")
|
||||
|
||||
BIN
build/libcrypto-3-x64.dll
Normal file
BIN
build/libcrypto-3-x64.dll
Normal file
Binary file not shown.
BIN
build/libssl-3-x64.dll
Normal file
BIN
build/libssl-3-x64.dll
Normal file
Binary file not shown.
Reference in New Issue
Block a user