152 lines
6.4 KiB
Python
152 lines
6.4 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 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")
|
|
compiler.report_path = Path(f"./build/compile_report-{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.save_xml = False
|
|
|
|
# 检测 --xml 参数
|
|
if '--xml' in sys.argv:
|
|
compiler.save_xml = True
|
|
sys.argv.remove('--xml')
|
|
|
|
if '--report' in sys.argv:
|
|
compiler.save_report = True
|
|
sys.argv.remove('--report')
|
|
|
|
# 检测 --output xx 参数
|
|
if '--output' in sys.argv:
|
|
# 输入的是输出目录
|
|
out_path = sys.argv[sys.argv.index('--output') + 1]
|
|
compiler.output_path = Path(out_path)
|
|
sys.argv.remove('--output')
|
|
sys.argv.remove(out_path)
|
|
|
|
if '--lto=yes' in sys.argv:
|
|
compiler.use_lto = True
|
|
sys.argv.remove('--lto=yes')
|
|
|
|
# 检测 --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}')
|
|
|
|
if is_github:
|
|
from pprint import pprint
|
|
pprint(compiler.option())
|
|
else:
|
|
compiler.output_path = Path(f'./build/nuitka-{platform.system().lower()}')
|
|
|
|
print(compiler.as_markdown())
|
|
|
|
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 ('config', 'libs', 'assets')):
|
|
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', encoding='utf-8') as compile_data_file:
|
|
tomlkit.dump(compile_data, compile_data_file)
|
|
|
|
sys.exit(0)
|