Setup: update some stuff to 6.14.0 cx-Freeze (#1412)

* Setup: update some stuff to 6.14.0 cx-Freeze

* Fix BuildCommand and replace include_files by cutom step

* setup.py: bit more cleanup for extra_libs

Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
This commit is contained in:
Fabian Dill 2023-01-25 00:20:26 +01:00 committed by GitHub
parent 86fb450ecc
commit ba519fecd0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 8 deletions

View File

@ -12,6 +12,7 @@ from hashlib import sha3_512
from pathlib import Path from pathlib import Path
import setuptools import setuptools
import setuptools.command.build
if __name__ == "__main__": if __name__ == "__main__":
import ModuleUpdate import ModuleUpdate
@ -30,7 +31,7 @@ apworlds: set = {
# This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it # This is a bit jank. We need cx-Freeze to be able to run anything from this script, so install it
import subprocess import subprocess
import pkg_resources import pkg_resources
requirement = 'cx-Freeze>=6.13.1' requirement = 'cx-Freeze>=6.14.0'
try: try:
pkg_resources.require(requirement) pkg_resources.require(requirement)
import cx_Freeze import cx_Freeze
@ -68,6 +69,7 @@ exes = [
] ]
extra_data = ["LICENSE", "data", "EnemizerCLI", "host.yaml", "SNI"] extra_data = ["LICENSE", "data", "EnemizerCLI", "host.yaml", "SNI"]
extra_libs = ["libssl.so", "libcrypto.so"] if is_linux else []
def remove_sprites_from_folder(folder): def remove_sprites_from_folder(folder):
@ -83,7 +85,7 @@ def _threaded_hash(filepath):
# cx_Freeze's build command runs other commands. Override to accept --yes and store that. # cx_Freeze's build command runs other commands. Override to accept --yes and store that.
class BuildCommand(cx_Freeze.command.build.Build): class BuildCommand(setuptools.command.build.build):
user_options = [ user_options = [
('yes', 'y', 'Answer "yes" to all questions.'), ('yes', 'y', 'Answer "yes" to all questions.'),
] ]
@ -107,6 +109,7 @@ class BuildExeCommand(cx_Freeze.command.build_exe.BuildEXE):
] ]
yes: bool yes: bool
extra_data: Iterable # [any] not available in 3.8 extra_data: Iterable # [any] not available in 3.8
extra_libs: Iterable # work around broken include_files
buildfolder: Path buildfolder: Path
libfolder: Path libfolder: Path
@ -117,6 +120,7 @@ class BuildExeCommand(cx_Freeze.command.build_exe.BuildEXE):
super().initialize_options() super().initialize_options()
self.yes = BuildCommand.last_yes self.yes = BuildCommand.last_yes
self.extra_data = [] self.extra_data = []
self.extra_libs = []
def finalize_options(self): def finalize_options(self):
super().finalize_options() super().finalize_options()
@ -173,17 +177,22 @@ class BuildExeCommand(cx_Freeze.command.build_exe.BuildEXE):
self.buildtime = datetime.datetime.utcnow() self.buildtime = datetime.datetime.utcnow()
super().run() super().run()
# include_files seems to be broken with this setup. implement here # include_files seems to not be done automatically. implement here
for src, dst in self.include_files: for src, dst in self.include_files:
print('copying', src, '->', self.buildfolder / dst) print(f"copying {src} -> {self.buildfolder / dst}")
shutil.copyfile(src, self.buildfolder / dst, follow_symlinks=False)
# now that include_files is completely broken, run find_libs here
for src, dst in find_libs(*self.extra_libs):
print(f"copying {src} -> {self.buildfolder / dst}")
shutil.copyfile(src, self.buildfolder / dst, follow_symlinks=False) shutil.copyfile(src, self.buildfolder / dst, follow_symlinks=False)
# post build steps # post build steps
if sys.platform == "win32": # kivy_deps is win32 only, linux picks them up automatically if is_windows: # kivy_deps is win32 only, linux picks them up automatically
from kivy_deps import sdl2, glew from kivy_deps import sdl2, glew
for folder in sdl2.dep_bins + glew.dep_bins: for folder in sdl2.dep_bins + glew.dep_bins:
shutil.copytree(folder, self.libfolder, dirs_exist_ok=True) shutil.copytree(folder, self.libfolder, dirs_exist_ok=True)
print('copying', folder, '->', self.libfolder) print(f"copying {folder} -> {self.libfolder}")
for data in self.extra_data: for data in self.extra_data:
self.installfile(Path(data)) self.installfile(Path(data))
@ -384,6 +393,9 @@ $APPDIR/$exe "$@"
def find_libs(*args: str) -> typing.Sequence[typing.Tuple[str, str]]: def find_libs(*args: str) -> typing.Sequence[typing.Tuple[str, str]]:
"""Try to find system libraries to be included.""" """Try to find system libraries to be included."""
if not args:
return []
arch = build_arch.replace('_', '-') arch = build_arch.replace('_', '-')
libc = 'libc6' # we currently don't support musl libc = 'libc6' # we currently don't support musl
@ -450,12 +462,13 @@ cx_Freeze.setup(
"pandas"], "pandas"],
"zip_include_packages": ["*"], "zip_include_packages": ["*"],
"zip_exclude_packages": ["worlds", "sc2"], "zip_exclude_packages": ["worlds", "sc2"],
"include_files": find_libs("libssl.so", "libcrypto.so") if is_linux else [], "include_files": [], # broken in cx 6.14.0, we use more special sauce now
"include_msvcr": False, "include_msvcr": False,
"replace_paths": [("*", "")], "replace_paths": ["*."],
"optimize": 1, "optimize": 1,
"build_exe": buildfolder, "build_exe": buildfolder,
"extra_data": extra_data, "extra_data": extra_data,
"extra_libs": extra_libs,
"bin_includes": ["libffi.so", "libcrypt.so"] if is_linux else [] "bin_includes": ["libffi.so", "libcrypt.so"] if is_linux else []
}, },
"bdist_appimage": { "bdist_appimage": {