1
0
mirror of https://github.com/EDCD/EDMarketConnector.git synced 2025-05-30 23:29:30 +03:00

setup.py: isorted imports & de-caps config variables

* Test build exhibited no issues.
This commit is contained in:
Athanasius 2021-03-22 12:35:44 +00:00
parent 41cb4c24ce
commit bc5f805b5a

136
setup.py
View File

@ -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<item>
\t\t\t<title>Release {appversion}</title>
\t\t\t<description>
\t\t\t\t<![CDATA[
<style>{STYLE}</style>
<h2>Release {appversion}</h2>
<ul>
</ul>
\t\t\t\t]]>
\t\t\t</description>
\t\t\t<enclosure
\t\t\t\turl="https://github.com/EDCD/EDMarketConnector/releases/download/rel-{appversion}/{PKG}"
\t\t\t\tsparkle:os="{OS}"
\t\t\t\tsparkle:version="{appversion}"
\t\t\t\tlength="{LENGTH}"
\t\t\t\ttype="application/octet-stream"
\t\t\t/>
\t\t</item>
'''.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)
)