From bc5f805b5a501b6cc6e468b22e935ccce3927593 Mon Sep 17 00:00:00 2001 From: Athanasius Date: Mon, 22 Mar 2021 12:35:44 +0000 Subject: [PATCH] setup.py: isorted imports & de-caps config variables * Test build exhibited no issues. --- setup.py | 136 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 83 insertions(+), 53 deletions(-) diff --git a/setup.py b/setup.py index 165c01ed..23a54ffe 100755 --- a/setup.py +++ b/setup.py @@ -1,28 +1,25 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -This is a setup.py script generated by py2applet +Script to build to .exe and .msi package. -Usage: - python setup.py py2app +.exe build is via py2exe on win32. +.msi packaging utilises Windows SDK. """ -from distutils.core import setup import codecs import os -from os.path import exists, isdir, join import platform import re import shutil import sys +from distutils.core import setup +from os.path import exists, isdir, join from tempfile import gettempdir + import semantic_version -from config import appname as APPNAME, applongname as APPLONGNAME, appcmdname as APPCMDNAME, appversion as VERSION, copyright as COPYRIGHT -from config import update_feed, update_interval - -if sys.version_info[0:2] != (3, 7): - raise AssertionError(f'Unexpected python version {sys.version}') +from config import appcmdname, applongname, appname, appversion, copyright, update_feed, update_interval if sys.platform=='win32': assert platform.architecture()[0]=='32bit', 'Assumes a Python built for 32bit' @@ -34,8 +31,8 @@ else: assert False, 'Unsupported platform %s' % sys.platform # Split version, as py2exe wants the 'base' for version -semver = semantic_version.Version.coerce(VERSION) -BASEVERSION = str(semver.truncate('patch')) +semver = semantic_version.Version.coerce(appversion) +BASEappversion = str(semver.truncate('patch')) if dist_dir and len(dist_dir)>1 and isdir(dist_dir): shutil.rmtree(dist_dir) @@ -66,7 +63,7 @@ if sys.platform=='darwin': APP = 'EDMarketConnector.py' APPCMD = 'EDMC.py' -SHORTVERSION = ''.join(VERSION.split('.')[:3]) +SHORTappversion = ''.join(appversion.split('.')[:3]) PLUGINS = [ 'plugins/coriolis.py', 'plugins/eddb.py', 'plugins/eddn.py', 'plugins/edsm.py', 'plugins/edsy.py', 'plugins/inara.py' ] if sys.platform=='darwin': @@ -83,26 +80,26 @@ if sys.platform=='darwin': ], 'frameworks': [ 'Sparkle.framework' ], 'excludes': [ 'distutils', '_markerlib', 'PIL', 'pkg_resources', 'simplejson', 'unittest' ], - 'iconfile': '%s.icns' % APPNAME, + 'iconfile': '%s.icns' % appname, 'include_plugins': [('plugins', x) for x in PLUGINS], 'resources': [ 'commodity.csv', 'rare_commodity.csv', 'snd_good.wav', 'snd_bad.wav', 'modules.p', 'ships.p', 'stations.p', 'systems.p'], 'site_packages': False, 'plist': { - 'CFBundleName': APPLONGNAME, - 'CFBundleIdentifier': 'uk.org.marginal.%s' % APPNAME.lower(), + 'CFBundleName': applongname, + 'CFBundleIdentifier': 'uk.org.marginal.%s' % appname.lower(), 'CFBundleLocalizations': sorted(set([x[:-len('.lproj')] for x in os.listdir(join(SPARKLE, 'Resources')) if x.endswith('.lproj')]) | set([x[:-len('.strings')] for x in os.listdir('L10n') if x.endswith('.strings')])), # https://github.com/sparkle-project/Sparkle/issues/238 - 'CFBundleShortVersionString': VERSION, - 'CFBundleVersion': VERSION, + 'CFBundleShortVersionString': appversion, + 'CFBundleVersion': appversion, 'CFBundleURLTypes': [ { 'CFBundleTypeRole': 'Viewer', - 'CFBundleURLName': 'uk.org.marginal.%s.URLScheme' % APPNAME.lower(), + 'CFBundleURLName': 'uk.org.marginal.%s.URLScheme' % appname.lower(), 'CFBundleURLSchemes': ['edmc'], } ], 'LSMinimumSystemVersion': '10.10', 'NSAppleScriptEnabled': True, - 'NSHumanReadableCopyright': COPYRIGHT, + 'NSHumanReadableCopyright': copyright, 'SUEnableAutomaticChecks': True, 'SUShowReleaseNotes': True, 'SUAllowsAutomaticUpdates': False, @@ -145,8 +142,8 @@ elif sys.platform=='win32': 'ships.p', 'stations.p', 'systems.p', - '%s.VisualElementsManifest.xml' % APPNAME, - '%s.ico' % APPNAME, + '%s.VisualElementsManifest.xml' % appname, + '%s.ico' % appname, 'EDMarketConnector - TRACE.bat', 'EDMarketConnector - localserver-auth.bat', ]), @@ -155,26 +152,26 @@ elif sys.platform=='win32': ] setup( - name = APPLONGNAME, - version = VERSION, - windows = [ {'dest_base': APPNAME, + name = applongname, + version = appversion, + windows = [ {'dest_base': appname, 'script': APP, - 'icon_resources': [(0, '%s.ico' % APPNAME)], + 'icon_resources': [(0, '%s.ico' % appname)], 'company_name': 'EDCD', # WinSparkle - 'product_name': APPNAME, # WinSparkle - 'version': BASEVERSION, - 'product_version': VERSION, - 'copyright': COPYRIGHT, - 'other_resources': [(24, 1, open(APPNAME+'.manifest').read())], + 'product_name': appname, # WinSparkle + 'version': BASEappversion, + 'product_version': appversion, + 'copyright': copyright, + 'other_resources': [(24, 1, open(appname+'.manifest').read())], } ], - console = [ {'dest_base': APPCMDNAME, + console = [ {'dest_base': appcmdname, 'script': APPCMD, 'company_name': 'EDCD', - 'product_name': APPNAME, - 'version': BASEVERSION, - 'product_version': VERSION, - 'copyright': COPYRIGHT, - 'other_resources': [(24, 1, open(APPCMDNAME+'.manifest').read())], + 'product_name': appname, + 'version': BASEappversion, + 'product_version': appversion, + 'copyright': copyright, + 'other_resources': [(24, 1, open(appcmdname+'.manifest').read())], } ], data_files = DATA_FILES, options = OPTIONS, @@ -182,42 +179,75 @@ setup( PKG = None if sys.platform == 'darwin': - if isdir('%s/%s.app' % (dist_dir, APPLONGNAME)): # from CFBundleName - os.rename('%s/%s.app' % (dist_dir, APPLONGNAME), '%s/%s.app' % (dist_dir, APPNAME)) + if isdir('%s/%s.app' % (dist_dir, applongname)): # from CFBundleName + os.rename('%s/%s.app' % (dist_dir, applongname), '%s/%s.app' % (dist_dir, appname)) # Generate OSX-style localization files for x in os.listdir('L10n'): if x.endswith('.strings'): lang = x[:-len('.strings')] - path = '%s/%s.app/Contents/Resources/%s.lproj' % (dist_dir, APPNAME, lang) + path = '%s/%s.app/Contents/Resources/%s.lproj' % (dist_dir, appname, lang) os.mkdir(path) codecs.open('%s/Localizable.strings' % path, 'w', 'utf-16').write(codecs.open('L10n/%s' % x, 'r', 'utf-8').read()) if macdeveloperid: - os.system('codesign --deep -v -s "Developer ID Application: %s" %s/%s.app' % (macdeveloperid, dist_dir, APPNAME)) + os.system('codesign --deep -v -s "Developer ID Application: %s" %s/%s.app' % (macdeveloperid, dist_dir, appname)) # Make zip for distribution, preserving signature - PKG = '%s_mac_%s.zip' % (APPNAME, VERSION) - os.system('cd %s; ditto -ck --keepParent --sequesterRsrc %s.app ../%s; cd ..' % (dist_dir, APPNAME, PKG)) + PKG = '%s_mac_%s.zip' % (appname, appversion) + os.system('cd %s; ditto -ck --keepParent --sequesterRsrc %s.app ../%s; cd ..' % (dist_dir, appname, PKG)) elif sys.platform == 'win32': - os.system(r'"%s\candle.exe" -out %s\ %s.wxs' % (WIXPATH, dist_dir, APPNAME)) - if not exists('%s/%s.wixobj' % (dist_dir, APPNAME)): - raise AssertionError('No %s/%s.wixobj: candle.exe failed?' % (dist_dir, APPNAME)) + os.system(r'"%s\candle.exe" -out %s\ %s.wxs' % (WIXPATH, dist_dir, appname)) + if not exists('%s/%s.wixobj' % (dist_dir, appname)): + raise AssertionError('No %s/%s.wixobj: candle.exe failed?' % (dist_dir, appname)) - PKG = '%s_win_%s.msi' % (APPNAME, VERSION) + PKG = '%s_win_%s.msi' % (appname, appversion) import subprocess - os.system(r'"%s\light.exe" -sacl -spdb -sw1076 %s\%s.wixobj -out %s' % (WIXPATH, dist_dir, APPNAME, PKG)) + os.system(r'"%s\light.exe" -sacl -spdb -sw1076 %s\%s.wixobj -out %s' % (WIXPATH, dist_dir, appname, PKG)) if not exists(PKG): raise AssertionError('light.exe failed, no %s' % (PKG)) # Seriously, this is how you make Windows Installer use the user's display language for its dialogs. What a crock. # http://www.geektieguy.com/2010/03/13/create-a-multi-lingual-multi-language-msi-using-wix-and-custom-build-scripts - lcids = [int(x) for x in re.search(r'Languages\s*=\s*"(.+?)"', open('%s.wxs' % APPNAME).read()).group(1).split(',')] + lcids = [int(x) for x in re.search(r'Languages\s*=\s*"(.+?)"', open('%s.wxs' % appname).read()).group(1).split(',')] assert lcids[0]==1033, 'Default language is %d, should be 1033 (en_US)' % lcids[0] - shutil.copyfile(PKG, join(gettempdir(), '%s_1033.msi' % APPNAME)) + shutil.copyfile(PKG, join(gettempdir(), '%s_1033.msi' % appname)) for lcid in lcids[1:]: - shutil.copyfile(join(gettempdir(), '%s_1033.msi' % APPNAME), join(gettempdir(), '%s_%d.msi' % (APPNAME, lcid))) - os.system(r'cscript /nologo "%s\WiLangId.vbs" %s\%s_%d.msi Product %d' % (SDKPATH, gettempdir(), APPNAME, lcid, lcid)) # Don't care about codepage because the displayed strings come from msiexec not our msi - os.system(r'"%s\MsiTran.Exe" -g %s\%s_1033.msi %s\%s_%d.msi %s\%d.mst' % (SDKPATH, gettempdir(), APPNAME, gettempdir(), APPNAME, lcid, gettempdir(), lcid)) + shutil.copyfile(join(gettempdir(), '%s_1033.msi' % appname), join(gettempdir(), '%s_%d.msi' % (appname, lcid))) + os.system(r'cscript /nologo "%s\WiLangId.vbs" %s\%s_%d.msi Product %d' % (SDKPATH, gettempdir(), appname, lcid, lcid)) # Don't care about codepage because the displayed strings come from msiexec not our msi + os.system(r'"%s\MsiTran.Exe" -g %s\%s_1033.msi %s\%s_%d.msi %s\%d.mst' % (SDKPATH, gettempdir(), appname, gettempdir(), appname, lcid, gettempdir(), lcid)) os.system(r'cscript /nologo "%s\WiSubStg.vbs" %s %s\%d.mst %d' % (SDKPATH, PKG, gettempdir(), lcid, lcid)) else: raise AssertionError('Unsupported platform') + +if not exists(PKG): + raise AssertionError('No %s found prior to appcast' % (PKG)) +# Make appcast entry +appcast = open('appcast_%s_%s.xml' % (sys.platform=='darwin' and 'mac' or 'win', appversion), 'w') +appcast.write(''' +\t\t +\t\t\tRelease {appversion} +\t\t\t +\t\t\t\t{STYLE} +

Release {appversion}

+
    + +
+\t\t\t\t]]> +\t\t\t
+\t\t\t +\t\t
+'''.format(appversion=appversion, + STYLE='{}'.format( + sys.platform=='win32' and 'body { font-family:"Segoe UI","Tahoma"; font-size: 75%; } h2 { font-family:"Segoe UI","Tahoma"; font-size: 105%; }' + or 'h2 { font-size: 105%; }'), + PKG=PKG, + OS=''.format(sys.platform=='win32' and 'windows"\n\t\t\t\tsparkle:installerArguments="/passive LAUNCH=yes' or 'macos'), + LENGTH=os.stat(PKG).st_size) +)