import os import sys import shutil import PyInstaller.__main__ is_64bit = sys.maxsize > 2**32 # is_linux = sys.platform.startswith("linux") exclude_modules = [] # if is_linux == False: # print("Not Linux, excluding pygame.") # exclude_modules.append('pygame') add_data = [ "quirks;quirks", "smilies;smilies", "themes;themes", "docs;docs", "README.md;.", "LICENSE;.", "CHANGELOG.md;.", "PCskins.png;.", "Pesterchum.png;.", ] data_folders = { "quirks": "quirks", "smilies": "smilies", "themes": "themes", "docs": "docs", } data_files = { "README.md": "README.md.txt", "LICENSE": "LICENSE.txt", "CHANGELOG.md": "CHANGELOG.md.txt", "PCskins.png": ".", "Pesterchum.png": ".", } data_files_linux = { "README.md": "README.md", "LICENSE": "LICENSE.txt", "CHANGELOG.md": "CHANGELOG.md", "PCskins.png": ".", "Pesterchum.png": ".", } # Some of these might not be required anymore, # newer versions of PyInstaller claim to exclude certain problematic DDLs automatically. upx_exclude = [ "qwindows.dll", "Qt6Core.dll", "Qt6Gui.dll", "vcruntime140.dll", "MSVCP140.dll", "MSVCP140_1.dll" "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-console-l1-1-0.dll", "api-ms-win-core-console-l1-2-0.dll", "api-ms-win-core-datetime-l1-1-0.dll", "api-ms-win-core-debug-l1-1-0.dll", "api-ms-win-core-errorhandling-l1-1-0.dll", "api-ms-win-core-file-l1-1-0.dll", "api-ms-win-core-file-l1-2-0.dll", "api-ms-win-core-file-l2-1-0.dll", "api-ms-win-core-handle-l1-1-0.dll", "api-ms-win-core-heap-l1-1-0.dll", "api-ms-win-core-interlocked-l1-1-0.dll", "api-ms-win-core-libraryloader-l1-1-0.dll", "api-ms-win-core-localization-l1-2-0.dll", "api-ms-win-core-memory-l1-1-0.dll", "api-ms-win-core-namedpipe-l1-1-0.dll", "api-ms-win-core-processenvironment-l1-1-0.dll", "api-ms-win-core-processthreads-l1-1-0.dll", "api-ms-win-core-processthreads-l1-1-1.dll", "api-ms-win-core-profile-l1-1-0.dll", "api-ms-win-core-rtlsupport-l1-1-0.dll", "api-ms-win-core-string-l1-1-0.dll", "api-ms-win-core-synch-l1-1-0.dll", "api-ms-win-core-synch-l1-2-0.dll", "api-ms-win-core-sysinfo-l1-1-0.dll", "api-ms-win-core-timezone-l1-1-0.dll", "api-ms-win-core-util-l1-1-0.dll", "API-MS-Win-core-xstate-l2-1-0.dll", "api-ms-win-crt-conio-l1-1-0.dll", "api-ms-win-crt-convert-l1-1-0.dll", "api-ms-win-crt-environment-l1-1-0.dll", "api-ms-win-crt-filesystem-l1-1-0.dll", "api-ms-win-crt-heap-l1-1-0.dll", "api-ms-win-crt-locale-l1-1-0.dll", "api-ms-win-crt-math-l1-1-0.dll", "api-ms-win-crt-multibyte-l1-1-0.dll", "api-ms-win-crt-private-l1-1-0.dll", "api-ms-win-crt-process-l1-1-0.dll", "api-ms-win-crt-runtime-l1-1-0.dll", "api-ms-win-crt-stdio-l1-1-0.dll", "api-ms-win-crt-string-l1-1-0.dll", "api-ms-win-crt-time-l1-1-0.dll", "api-ms-win-crt-utility-l1-1-0.dll", "ucrtbase.dll", ] delete_builddist = "" upx_enabled = "" package_universal_crt = "" onefile = "" windowed = "" try: print("This is a script to make building with Pyinstaller a bit more conventient.") while (delete_builddist != "y") and (delete_builddist != "n"): delete_builddist = input("Delete build & dist folders? (Y/N): ").lower() if delete_builddist == "y": try: shutil.rmtree("dist") except FileNotFoundError as e: print(e) try: shutil.rmtree("build") except FileNotFoundError as e: print(e) while (upx_enabled != "y") and (upx_enabled != "n"): upx_enabled = input("Enable UPX? (Y/N): ").lower() if upx_enabled == "y": print("If upx is on your path you don't need to include anything here.") if is_64bit == True: upx_dir = input("UPX directory [D:\\upx-3.96-win64]: ") if upx_dir == "": upx_dir = "D:\\upx-3.96-win64" # Default dir for me :) else: upx_dir = input("UPX directory [D:\\upx-3.96-win32]: ") if upx_dir == "": upx_dir = "D:\\upx-3.96-win32" # Default dir for me :) print("upx_dir = " + upx_dir) elif upx_enabled == "n": upx_dir = "" while (windowed != "y") and (windowed != "n"): windowed = input("Build with '--windowed'? (Y/N): ").lower() if sys.platform == "win32": print( "(https://pyinstaller.readthedocs.io/en/stable/usage.html?highlight=sdk#windows)" ) while (package_universal_crt != "y") and (package_universal_crt != "n"): package_universal_crt = input( "Try to include universal CRT? (Y/N): " ).lower() if package_universal_crt == "y": if is_64bit == True: crt_path = input( "Universal CRT: [C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\10.0.19041.0\\ucrt\\DLLs\\x64]: " ) if crt_path == "": # crt_path = "C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\10.0.19041.0\\ucrt\\DLLs\\x64" # Default directory. crt_path = os.path.join( "C:%s" % os.sep, "Program Files (x86)", "Windows Kits", "10", "10.0.19041.0", "ucrt", "DLLs", "x64", ) else: crt_path = input( "Extra path: [C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\10.0.19041.0\\ucrt\\DLLs\\x86]: " ) if crt_path == "": # crt_path = "C:\\Program Files (x86)\\Windows Kits\\10\\Redist\\10.0.19041.0\\ucrt\\DLLs\\x86" # Default directory. crt_path = os.path.join( "C:%s" % os.sep, "Program Files (x86)", "Windows Kits", "10", "10.0.19041.0", "ucrt", "DLLs", "x86", ) print("crt_path = " + crt_path) if (sys.platform == "win32") or (sys.platform == "linux"): while (onefile != "y") and (onefile != "n"): onefile = input("Build with '--onefile'? (Y/N): ").lower() except KeyboardInterrupt: sys.exit("KeyboardInterrupt") # Windows if sys.platform == "win32": run_win32 = [ "pesterchum.py", "--name=Pesterchum", #'--noconfirm', # Overwrite output directory. #'--windowed', # Hide console "--icon=pesterchum.ico", "--clean", # Clear cache ] if (sys.version_info.major == 3) & (sys.version_info.minor == 8): exclude_modules.append("tkinter") if upx_enabled == "y": if os.path.isdir(upx_dir): run_win32.append("--upx-dir=%s" % upx_dir) for x in upx_exclude: run_win32.append("--upx-exclude=%s" % x) # Lower case variants are required. run_win32.append("--upx-exclude=%s" % x.lower()) elif upx_enabled == "n": run_win32.append("--noupx") for x in exclude_modules: run_win32.append("--exclude-module=%s" % x) if windowed == "y": run_win32.append("--windowed") if onefile == "y": run_win32.append("--onefile") elif onefile == "n": for x in add_data: run_win32.append("--add-data=%s" % x) if package_universal_crt == "y": run_win32.append('--paths="%s"' % crt_path) if os.path.exists(crt_path): if is_64bit == False: run_win32.append( "--add-binary=%s\\api-ms-win-core-console-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-console-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-console-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-datetime-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-debug-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-errorhandling-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l2-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-handle-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-heap-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-interlocked-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-libraryloader-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-localization-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-memory-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-namedpipe-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processenvironment-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processthreads-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processthreads-l1-1-1.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-profile-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-rtlsupport-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-string-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-synch-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-synch-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-sysinfo-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-timezone-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-util-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\API-MS-Win-core-xstate-l2-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-conio-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-convert-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-environment-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-filesystem-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-heap-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-locale-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-math-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-multibyte-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-private-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-process-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-runtime-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-stdio-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-string-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-time-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-utility-l1-1-0.dll;." % crt_path ) run_win32.append("--add-binary=%s\\ucrtbase.dll;." % crt_path) elif is_64bit == True: run_win32.append( "--add-binary=%s\\api-ms-win-core-console-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-console-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-datetime-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-debug-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-errorhandling-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-file-l2-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-handle-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-heap-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-interlocked-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-libraryloader-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-localization-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-memory-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-namedpipe-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processenvironment-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processthreads-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-processthreads-l1-1-1.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-profile-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-rtlsupport-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-string-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-synch-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-synch-l1-2-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-sysinfo-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-timezone-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-core-util-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-conio-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-convert-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-environment-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-filesystem-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-heap-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-locale-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-math-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-multibyte-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-private-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-process-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-runtime-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-stdio-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-string-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-time-l1-1-0.dll;." % crt_path ) run_win32.append( "--add-binary=%s\\api-ms-win-crt-utility-l1-1-0.dll;." % crt_path ) run_win32.append("--add-binary=%s\\ucrtbase.dll;." % crt_path) print(run_win32) PyInstaller.__main__.run(run_win32) if onefile == "y": # There's more proper ways to do this, but this doesn't require changing our paths for x in data_folders: print(x) shutil.copytree( x, os.path.join("dist", data_folders[x]), ignore=shutil.ignore_patterns( "*.psd", "*.xcf*", "ebg2.png", "ebg1.png" ), ) for x in data_files: print(x) shutil.copy(x, os.path.join("dist", data_files[x])) files = os.listdir("dist") try: os.mkdir(os.path.join("dist", "Pesterchum")) except FileExistsError: pass for x in files: shutil.move(os.path.join("dist", x), os.path.join("dist", "Pesterchum")) # shutil.copy(os.path.join('build', 'Pesterchum', 'xref-Pesterchum.html'), # os.path.join('dist', 'Pesterchum', 'xref-Pesterchum.html')) # shutil.copy(os.path.join('build', 'Pesterchum', 'Analysis-00.toc'), # os.path.join('dist', 'Pesterchum', 'Analysis-00.toc')) # MacOS elif sys.platform == "darwin": run_darwin = [ "pesterchum.py", "--name=Pesterchum", #'--windowed', # Hide console #'--noconfirm', # Overwrite output directory. "--icon=trayicon32.icns", # Icon "--onedir", "--clean", # Clear cache #'--noupx' ] if upx_enabled == "y": if os.path.isdir(upx_dir): run_darwin.append("--upx-dir=%s" % upx_dir) for x in upx_exclude: run_darwin.append("--upx-exclude=%s" % x) # Lower case variants are required. run_darwin.append("--upx-exclude=%s" % x.lower()) elif upx_enabled == "n": run_darwin.append("--noupx") if os.path.isdir(upx_dir): run_darwin.append("--upx-dir=%s" % upx_dir) for x in exclude_modules: run_darwin.append("--exclude-module=%s" % x) for x in add_data: run_darwin.append("--add-data=%s" % x.replace(";", ":")) if windowed == "y": run_darwin.append("--windowed") PyInstaller.__main__.run(run_darwin) # Linux elif sys.platform == "linux": run_linux = [ "pesterchum.py", "--name=Pesterchum", #'--windowed', # Hide console #'--noconfirm', # Overwrite output directory. "--icon=trayicon32.icns", # Icon "--clean", # Clear cache ] if upx_enabled == "y": if os.path.isdir(upx_dir): run_linux.append("--upx-dir=%s" % upx_dir) for x in upx_exclude: run_linux.append("--upx-exclude=%s" % x) # Lower case variants are required. run_linux.append("--upx-exclude=%s" % x.lower()) elif upx_enabled == "n": run_linux.append("--noupx") for x in exclude_modules: run_linux.append("--exclude-module=%s" % x) if onefile == "y": run_linux.append("--onefile") elif onefile == "n": for x in add_data: run_linux.append("--add-data=%s" % x.replace(";", ":")) if windowed == "y": run_linux.append("--windowed") print(run_linux) PyInstaller.__main__.run(run_linux) if onefile == "y": # There's more proper ways to do this, but this doesn't require changing our paths for x in data_folders: print(x) shutil.copytree( x, os.path.join("dist", data_folders[x]), ignore=shutil.ignore_patterns( "*.psd", "*.xcf*", "ebg2.png", "ebg1.png" ), ) for x in data_files_linux: print(x) shutil.copy(x, os.path.join("dist", data_files_linux[x])) files = os.listdir("dist") try: os.mkdir(os.path.join("dist", ".cache")) except FileExistsError as e: print(e) for x in files: try: shutil.move(os.path.join("dist", x), os.path.join("dist", ".cache", x)) except FileExistsError as e: print(e) shutil.move(os.path.join("dist", ".cache"), os.path.join("dist", "Pesterchum")) # shutil.copy(os.path.join('build', 'Pesterchum', 'xref-Pesterchum.html'), # os.path.join('dist', 'Pesterchum', 'xref-Pesterchum.html')) # shutil.copy(os.path.join('build', 'Pesterchum', 'Analysis-00.toc'), # os.path.join('dist', 'Pesterchum', 'Analysis-00.toc')) else: print("Unknown platform.") run_generic = [ "pesterchum.py", "--name=Pesterchum" "--clean", # Clear cache ] if upx_enabled == "y": if os.path.isdir(upx_dir): run_generic.append("--upx-dir=%s" % upx_dir) else: run_generic.append("--noupx") for x in upx_exclude: run_generic.append("--upx-exclude=%s" % x) # Lower case variants are required. run_generic.append("--upx-exclude=%s" % x.lower()) for x in exclude_modules: run_generic.append("--exclude-module=%s" % x) for x in add_data: run_generic.append("--add-data=%s" % x.replace(";", ":")) if windowed == "y": run_win32.append("--windowed") print(run_generic) PyInstaller.__main__.run(run_generic)