Difficult-Rocket/nuitka_build.py

140 lines
6.0 KiB
Python

# -------------------------------
# Difficult Rocket
# Copyright © 2020-2023 by shenjackyuanjie 3695888@qq.com
# All rights reserved
# -------------------------------
import os
import sys
import time
import shutil
import tomlkit
import zipfile
import platform
import traceback
import subprocess
from typing import Tuple, Dict
from pathlib import Path
from libs.utils import nuitka
if __name__ == '__main__':
compiler = nuitka.CompilerHelper()
# 修改 python 执行文件 为 运行时的 python
compiler.python_cmd = sys.executable
compiler.xml_path = Path(f"./build/compile_data-{time.time()}.xml")
# 检测 --github 参数
is_github = False
if '--github' in sys.argv:
is_github = True
compiler.use_ccache = False
compiler.show_memory = False
compiler.show_progress = False
compiler.output_path = Path('./build/github')
compiler.python_cmd = 'python'
compiler.include_data_dir.remove(('./libs/fonts', './libs/fonts'))
compiler.save_xml = False
# 检测 --xml 参数
if '--xml' in sys.argv:
compiler.save_xml = True
sys.argv.remove('--xml')
# 检测 --output xx 参数
if '--output' in sys.argv:
# 输入的是输出目录
compiler.output_path = sys.argv[sys.argv.index('--output') + 1]
sys.argv.remove('--output')
sys.argv.remove(compiler.output_path)
# 检测 --no-pyglet-opt 参数
pyglet_optimizations = True
if pyglet_optimizations and '--no-pyglet-opt' not in sys.argv:
compiler.no_follow_import += [f'pyglet.app.{x}' for x in ['win32', 'xlib', 'cocoa']]
compiler.no_follow_import += [f'pyglet.input.{x}' for x in ['win32', 'linux', 'macos']]
compiler.no_follow_import += [f'pyglet.libs.{x}' for x in ['win32', 'x11', 'wayland', 'darwin', 'egl', 'headless']]
compiler.no_follow_import += [f'pyglet.window.{x}' for x in ['win32', 'xlib', 'cocoa', 'headless']]
compiler.no_follow_import += [f'pyglet.canvas.{x}' for x in ['win32', 'xlib', 'xlib_vidmoderstore', 'cocoa', 'headless']]
compiler.no_follow_import += [f'pyglet.gl.{x}' for x in ['win32', 'xlib', 'cocoa', 'headless']]
mult_plat_libs = ['app', 'input', 'libs', 'window', 'canvas', 'gl']
if platform.system() == "Windows":
for lib in mult_plat_libs:
compiler.no_follow_import.remove(f'pyglet.{lib}.win32')
elif platform.system() == "Linux":
for lib in mult_plat_libs:
for name in ('xlib', 'x11', 'wayland', 'egl'):
if f'pyglet.{lib}.{name}' in compiler.no_follow_import:
compiler.no_follow_import.remove(f'pyglet.{lib}.{name}')
compiler.no_follow_import.remove('pyglet.canvas.xlib_vidmoderstore')
elif platform.system() == "Darwin":
for lib in mult_plat_libs:
for name in ('cocoa', 'darwin', 'macos'):
if f'pyglet.{lib}.{name}' in compiler.no_follow_import:
compiler.no_follow_import.remove(f'pyglet.{lib}.{name}')
print(compiler.output_path)
print(compiler)
print(compiler.gen_subprocess_cmd())
# 确认是否需要编译
# 如果包含 -y 参数 则直接编译
if (('-y' or '-n') not in sys.argv) and (not is_github):
while (do_compile := input('Do you want to compile this file? (y/n) ')) not in ['y', 'n']:
pass
elif '-y' in sys.argv:
do_compile = 'y'
elif is_github:
do_compile = 'y'
else:
do_compile = 'n'
if do_compile == 'y':
# 编译
time.sleep(1) # 等待 1s
start_time = time.time_ns()
subprocess.run(compiler.gen_subprocess_cmd())
print('Compile Done!')
print(f'Compile Time: {time.time_ns() - start_time} ns ({(time.time_ns() - start_time) / 1000_000_000} s)')
if is_github:
# 去除无用字体文件 (其实现在也不会打包字体文件了 因为 git lfs 没宽带了)
try:
shutil.rmtree(compiler.output_path / 'DR.dist/libs/fonts' / 'Fira_Code', ignore_errors=True)
shutil.rmtree(compiler.output_path / 'DR.dist/libs/fonts' / 'scientifica', ignore_errors=True)
shutil.rmtree(compiler.output_path / 'DR.dist/libs/fonts' / 'HarmonyOS_Sans' / 'HarmonyOS_Sans_Condensed', ignore_errors=True)
shutil.rmtree(compiler.output_path / 'DR.dist/libs/fonts' / 'HarmonyOS_Sans' / 'HarmonyOS_Sans', ignore_errors=True)
os.remove(compiler.output_path / 'DR.dist/libs/fonts' / 'Monocraft.otf')
os.remove(compiler.output_path / 'DR.dist/libs/fonts' / 'SmileySans-Oblique.ttf')
except Exception:
traceback.print_exc()
print('Remove Useless Files Done!')
else:
dist_dir_size = 0
dist_file_size: Dict[str, Tuple[int, float]] = {}
for path, sub_paths, sub_files in os.walk(compiler.output_path / 'DR.dist'):
for file in sub_files:
file_path = os.path.join(path, file)
dist_dir_size += os.path.getsize(file_path)
# 排除不需要记录的文件
if any(x in file_path for x in ('configs', 'libs', 'textures')):
continue
dist_file_size[file_path] = (os.path.getsize(file_path), os.path.getsize(file_path) / 1024 / 1024)
compile_data = {'compile_time_ns': time.time_ns() - start_time,
'compile_time_s': (time.time_ns() - start_time) / 1000_000_000,
'dist_size': dist_dir_size,
'dist_size_mb': dist_dir_size / 1024 / 1024,
'compiler_data': compiler.str_option(),
'dist_file_size': dist_file_size}
with open(compiler.output_path / f'../compile_data-{time.time()}.toml', 'w') as compile_data_file:
tomlkit.dump(compile_data, compile_data_file)
sys.exit(0)