def build_patch(path, icon=None, diff=None): if diff is None: diff = [] if icon is None: icon = rpc(ICON_PATH) #folder_path = os.path.basename(ENTRY_POINT) #folder_path = folder_path[:folder_path.rfind('.')] script_path = relative_path_convert('enhc_inst.iss') common_dest = os.path.join(os.path.join(path, 'build'), ENTRY_POINT) app_path = os.path.abspath(common_dest) if len(diff) > 0: intal_del = ['[InstallDelete]'] for i in diff: intal_del.append('Type: files; Name: "{app}\\'+ i + '"') intal_del = os.linesep.join(intal_del) else: intal_del = '' build_iss(path, script_path, { '|exename|': '{}{}'.format(exe_name,'_patch'), '|favicon|': icon, '|INSTALLDEL|': intal_del, '|license|': relative_path_convert('gpl.txt'), '|start_ui|': app_path, '|outdir|': os.path.abspath(path), '|appver|': RELEASE_VER, '|scriptname|': ENTRY_POINT, '|modname|':module_name }, output_script_name='make_patch.iss')
def do_build(args): ap = ArgumentParser() ap.add_argument('--upx', action='store_true', help='Pack installer with upx') ap.add_argument('--clean', action='store_true', help='clean pyinstaller\'s cache before building') ap.add_argument('--patch', const=True, nargs='?', help='build a patch installer. Pass "only" argument to only build patch with no full installer.') ap.add_argument('--debug', choices=['full', 'console'], help='Build exe in debug mode') ap.add_argument('--diff', action='store_true', help='Diff the current install to remove bad files') ap.add_argument('--noinstall', action='store_true', help='Do not build the installer') ap.add_argument('--icon', help='Exe icon') ap.add_argument('--build-dir', dest='bd', help='Do not build and use existing directory') a = ap.parse_args() patch_only = a.patch and a.patch == 'only' if a.bd is None: path = relative_path_convert('freeze_' + str(datetime.now().strftime("%m-%d-%y %H %M %S"))) build_exe(path, upx=a.upx, icon_p=a.icon, debug=a.debug, clean=a.clean) else: path = a.bd if not a.noinstall: inst_icon_path = relative_path_convert(os.path.join(path, OUTPUT_INSTALL_ICON)) if os.path.isfile(INSTALL_ICON_PATH): overlay_inst_icon(rpc(ICON_PATH), INSTALL_ICON_PATH, inst_icon_path) else: inst_icon_path = rpc(ICON_PATH) if a.diff: #folder_path = os.path.basename(ENTRY_POINT) #folder_path = folder_path[:folder_path.rfind('.')] common_dest = os.path.join(path, ENTRY_POINT) app_path = os.path.abspath(common_dest) delete_me, rems = diff_install(app_path, split_ret=True) else: delete_me, rems = set(), set() if not patch_only: build_installer(path, icon=inst_icon_path, diff=delete_me.union(rems)) if a.patch: build_patch(path, icon=inst_icon_path, diff=rems)
def build_exe(path, upx=False, clean=False, icon_p=None, debug=False): print('Building...') if icon_p is None: icon_p = rpc(ICON_PATH) try: #import unicodedata # '--hidden-import=pkg_resources.py2_warn', command = [ pyinstaller, FILE_ENTRY_POINT, '--noconfirm', '--distpath={}'.format(path), '--workpath={}'.format(os.path.join(path, 'build')), '--icon={}'.format(icon_p), '--hidden-import=unicodedata', '--hidden-import=encodings.idna' ] if debug: if debug == 'all': command.insert(1, '--debug=all') if debug == 'console': command.append('--console') else: raise Exception('Unrecognized debug command: {}'.format(debug)) else: command.insert(1, '--noconsole') command.insert(2, '--windowed') if upx: command.insert(5, '--upx-dir={}'.format(UPX)) if clean: command.insert(5, '--clean') output = subprocess.check_output(command) #, env=my_env) print('Build Success: ' + str(path)) except subprocess.CalledProcessError as e: print('Build Failed') print(e) #folder_path = os.path.basename(ENTRY_POINT) common_dest = os.path.join(path, ENTRY_POINT) copy_files(common_dest) #copy_print(relative_path_convert('build'), os.path.join(path, 'build'), copyf=shutil.move) copy_files(os.path.join(path, os.path.join(path, 'build'), ENTRY_POINT))
def copy_files(common_dest): mod_embed_path = os.path.join(common_dest, module_name) try: os.mkdir(mod_embed_path) except FileExistsError: pass try: os.mkdir(os.path.join(mod_embed_path, 'Core')) except FileExistsError: pass copy_print(relative_path_convert('based_settings.json'), os.path.join(mod_embed_path,'settings.json')) copy_print(rpc(ICON_PATH), mod_embed_path) copy_print(rpc('Graveflo.png'), mod_embed_path) copy_print(rpc('title.png'), mod_embed_path) copy_print(rpc('Core/Data'), os.path.join(mod_embed_path, 'Core/Data'), copyf=shutil.copytree) images_folder = os.path.join(mod_embed_path, 'Images') #try: # os.mkdir(images_folder) #except FileExistsError: # pass #shutil.copy(relative_path_convert('Images/lens2.png'), os.path.join(images_folder, 'lens2.png')) copy_print(rpc('Images'), images_folder, copyf=shutil.copytree) #copy_print(relative_path_convert('Images/items'), os.path.join(images_folder, 'items'), # copyf=shutil.copytree) db_folder = os.path.join(mod_embed_path, 'bdo_database') try: os.mkdir(images_folder) except FileExistsError: pass try: os.mkdir(db_folder) except FileExistsError: pass shutil.copy(rpc('bdo_database/gear.sqlite3'), db_folder) try: os.mkdir(os.path.join(db_folder, 'tmp_imgs')) except FileExistsError: pass
@author: ☙ Ryan McConnell ♈♑ [email protected] ❧ """ import sys, os, shutil, json from argparse import ArgumentParser from datetime import datetime from BDO_Enhancement_Tool.__main__ import RELEASE_VER import subprocess, numpy import filecmp from BDO_Enhancement_Tool.utilities import center_rect, fitAspectRatio, FileSearcher from BDO_Enhancement_Tool.utilities import relative_path_convert as rpc relative_path_convert = lambda x: rpc(x, fp=__file__) INSTALLED_DIR = 'C:\\ProgramData\\Graveflo\'s Enhancement Tool\\' venv = r'.\bruh\Scripts' #venv = r'C:\ProgramData\Anaconda3\Scripts' pyinstaller = os.path.join(venv, 'pyinstaller.exe') ISCC = r'C:\Program Files (x86)\Inno Setup 5\ISCC.exe' UPX = r'C:\Program Files\upx-3.95-win64' module_name = 'BDO_Enhancement_Tool' SRC_WD = 'src/BDO_Enhancement_Tool' ENTRY_POINT = 'GraveflosEnhancementTool_win64' FILE_ENTRY_POINT = os.path.join(SRC_WD, ENTRY_POINT) + '.py' ICON_PATH = 'favicon.ico' INSTALL_ICON_PATH = '../install.png'