Update Windows Build
Fix the issues with cx_Freeze builds on newer versions of python and with newer version of PyQt5 - Update .gitignore to ignore .spec files - Update package.py to use pyInstaller instead of cx_Freeze - Update requirements-windows to have pyInstaller instead of cx_Freeze - Update setup.nsi to work with build and packaging changes - Add win_version_info.temp to build a version information file for pyInstaller as part of the package.py script
This commit is contained in:
parent
a1cacbe72b
commit
15bfe059c7
|
@ -22,3 +22,4 @@ cocoa/autogen
|
||||||
|
|
||||||
*.pyd
|
*.pyd
|
||||||
*.exe
|
*.exe
|
||||||
|
*.spec
|
80
package.py
80
package.py
|
@ -114,64 +114,38 @@ def package_source_tgz():
|
||||||
print_and_do('gzip {}'.format(dest))
|
print_and_do('gzip {}'.format(dest))
|
||||||
|
|
||||||
def package_windows():
|
def package_windows():
|
||||||
from cx_Freeze import setup, Executable
|
|
||||||
app_version = get_module_version('core')
|
app_version = get_module_version('core')
|
||||||
arch = platform.architecture()[0]
|
arch = platform.architecture()[0]
|
||||||
buildpath = op.join('build', 'dupeguru-win{}'.format(arch))
|
# Information to pass to pyinstaller and NSIS
|
||||||
# remove existing build directory
|
|
||||||
if op.exists(buildpath):
|
|
||||||
shutil.rmtree(buildpath)
|
|
||||||
include_files = []
|
|
||||||
# include locale files if they are built otherwise exit as it will break
|
|
||||||
# the localization
|
|
||||||
if op.exists('build/locale'):
|
|
||||||
include_files.append(('build/locale', 'locale'))
|
|
||||||
else:
|
|
||||||
print("Locale files not built, exiting...")
|
|
||||||
return
|
|
||||||
# include help files if they are built otherwise exit as they should be included?
|
|
||||||
if op.exists('build/help'):
|
|
||||||
include_files.append(('build/help', 'help'))
|
|
||||||
else:
|
|
||||||
print("Help files not built, exiting...")
|
|
||||||
return
|
|
||||||
# options for cx_Freeze
|
|
||||||
# if zip_include packages is not used, the cx_Freeze packager will include
|
|
||||||
# the whole PyQT5 directory
|
|
||||||
options = {
|
|
||||||
'build_exe': {
|
|
||||||
'build_exe': buildpath,
|
|
||||||
'excludes': [],
|
|
||||||
'includes': ['atexit', 'dbm.dumb'],
|
|
||||||
'include_files': include_files,
|
|
||||||
'include_msvcr': True,
|
|
||||||
'zip_include_packages': ['*'],
|
|
||||||
'zip_exclude_packages': []
|
|
||||||
},
|
|
||||||
}
|
|
||||||
# executables to build, uses se edition icon
|
|
||||||
executables = [
|
|
||||||
Executable(
|
|
||||||
script='run.py',
|
|
||||||
base='Win32GUI',
|
|
||||||
targetName='dupeguru.exe',
|
|
||||||
icon='images/dgse_logo.ico',
|
|
||||||
copyright='Copyright (C) 2017 Hardcoded Software'
|
|
||||||
)
|
|
||||||
]
|
|
||||||
# call cx_freeze
|
|
||||||
setup(
|
|
||||||
name='dupeguru',
|
|
||||||
version=app_version,
|
|
||||||
description='Tool to find duplicate files on your computer.',
|
|
||||||
options=options,
|
|
||||||
executables=executables,
|
|
||||||
script_args=['build']
|
|
||||||
)
|
|
||||||
# Information to pass to NSIS
|
|
||||||
version_array = app_version.split('.')
|
version_array = app_version.split('.')
|
||||||
match = re.search('[0-9]+', arch)
|
match = re.search('[0-9]+', arch)
|
||||||
bits = match.group(0)
|
bits = match.group(0)
|
||||||
|
# include locale files if they are built otherwise exit as it will break
|
||||||
|
# the localization
|
||||||
|
if not op.exists('build/locale'):
|
||||||
|
print("Locale files not built, exiting...")
|
||||||
|
return
|
||||||
|
# include help files if they are built otherwise exit as they should be included?
|
||||||
|
if not op.exists('build/help'):
|
||||||
|
print("Help files not built, exiting...")
|
||||||
|
return
|
||||||
|
# create version information file from template
|
||||||
|
try:
|
||||||
|
version_template = open("win_version_info.temp", "r")
|
||||||
|
version_info = version_template.read()
|
||||||
|
version_template.close()
|
||||||
|
version_info_file = open("win_version_info.txt", "w")
|
||||||
|
version_info_file.write(version_info.format(version_array[0], version_array[1], version_array[2], bits))
|
||||||
|
version_info_file.close()
|
||||||
|
except Exception:
|
||||||
|
print("Error creating version info file, exiting...")
|
||||||
|
return
|
||||||
|
# run pyinstaller via command line
|
||||||
|
print_and_do('pyinstaller -w --name=dupeguru-win{0} --icon=images/dgse_logo.ico '
|
||||||
|
'--add-data "build/locale;locale" --add-data "build/help;help" '
|
||||||
|
'--version-file win_version_info.txt run.py'.format(bits))
|
||||||
|
# remove version info file
|
||||||
|
os.remove('win_version_info.txt')
|
||||||
# Call NSIS (TODO update to not use hardcoded path)
|
# Call NSIS (TODO update to not use hardcoded path)
|
||||||
cmd = ('"C:\\Program Files (x86)\\NSIS\\Bin\\makensis.exe" '
|
cmd = ('"C:\\Program Files (x86)\\NSIS\\Bin\\makensis.exe" '
|
||||||
'/DVERSIONMAJOR={0} /DVERSIONMINOR={1} /DVERSIONPATCH={2} /DBITS={3} setup.nsi')
|
'/DVERSIONMAJOR={0} /DVERSIONMINOR={1} /DVERSIONPATCH={2} /DBITS={3} setup.nsi')
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
PyQt5 >=5.4,<6.0
|
PyQt5 >=5.4,<6.0
|
||||||
cx-Freeze>=5.1.1
|
|
||||||
pypiwin32>=200
|
pypiwin32>=200
|
||||||
|
pyinstaller>=3.4,<4.0
|
21
setup.nsi
21
setup.nsi
|
@ -34,7 +34,7 @@ SetCompressor /SOLID lzma
|
||||||
!endif
|
!endif
|
||||||
!ifndef SOURCEPATH
|
!ifndef SOURCEPATH
|
||||||
!echo "SOURCEPATH is NOT defined"
|
!echo "SOURCEPATH is NOT defined"
|
||||||
!define SOURCEPATH "build"
|
!define SOURCEPATH "dist"
|
||||||
!endif
|
!endif
|
||||||
!ifndef VERSIONMAJOR | VERSIONMINOR | VERSIONPATCH | BITS | SOURCEPATH
|
!ifndef VERSIONMAJOR | VERSIONMINOR | VERSIONPATCH | BITS | SOURCEPATH
|
||||||
!error "Command line Defines missing use /DDEFINE=VALUE to define before script"
|
!error "Command line Defines missing use /DDEFINE=VALUE to define before script"
|
||||||
|
@ -161,12 +161,12 @@ Section "!Application" AppSec
|
||||||
SetOutPath "$INSTDIR" ; set from result of installer pages
|
SetOutPath "$INSTDIR" ; set from result of installer pages
|
||||||
|
|
||||||
; Files to install
|
; Files to install
|
||||||
File /r "${SOURCEPATH}\${APPNAME}-win${BITS}bit\*"
|
File /r "${SOURCEPATH}\${APPNAME}-win${BITS}\*"
|
||||||
|
|
||||||
; Create Start Menu Items
|
; Create Start Menu Items
|
||||||
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
!insertmacro MUI_STARTMENU_WRITE_BEGIN Application
|
||||||
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
CreateDirectory "$SMPROGRAMS\$StartMenuFolder"
|
||||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" "$INSTDIR\${APPNAME}.exe"
|
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" "$INSTDIR\${APPNAME}-win${BITS}.exe"
|
||||||
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
CreateShortcut "$SMPROGRAMS\$StartMenuFolder\Uninstall.lnk" "$INSTDIR\Uninstall.exe"
|
||||||
!insertmacro MUI_STARTMENU_WRITE_END
|
!insertmacro MUI_STARTMENU_WRITE_END
|
||||||
|
|
||||||
|
@ -223,15 +223,16 @@ Section "Uninstall"
|
||||||
RMDir /r "$SMPROGRAMS\$StartMenuFolder"
|
RMDir /r "$SMPROGRAMS\$StartMenuFolder"
|
||||||
|
|
||||||
; Remove Files & Folders in Install Folder
|
; Remove Files & Folders in Install Folder
|
||||||
|
RMDir /r "$INSTDIR\core"
|
||||||
RMDir /r "$INSTDIR\help"
|
RMDir /r "$INSTDIR\help"
|
||||||
RMDir /r "$INSTDIR\imageformats"
|
RMDir /r "$INSTDIR\PyQt5"
|
||||||
RMDir /r "$INSTDIR\lib"
|
RMDir /r "$INSTDIR\qt"
|
||||||
RMDir /r "$INSTDIR\locale"
|
RMDir /r "$INSTDIR\locale"
|
||||||
RMDir /r "$INSTDIR\platforms"
|
Delete "$INSTDIR\*.exe"
|
||||||
Delete "$INSTDIR\dupeguru.exe"
|
Delete "$INSTDIR\*.dll"
|
||||||
Delete "$INSTDIR\python36.dll"
|
Delete "$INSTDIR\*.pyd"
|
||||||
Delete "$INSTDIR\sqlite3.dll"
|
Delete "$INSTDIR\*.zip"
|
||||||
Delete "$INSTDIR\Uninstall.exe"
|
Delete "$INSTDIR\*.manifest"
|
||||||
|
|
||||||
; Remove Install Folder if empty
|
; Remove Install Folder if empty
|
||||||
RMDir "$INSTDIR"
|
RMDir "$INSTDIR"
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
# UTF-8
|
||||||
|
#
|
||||||
|
# For more details about fixed file info 'ffi' see:
|
||||||
|
# http://msdn.microsoft.com/en-us/library/ms646997.aspx
|
||||||
|
VSVersionInfo(
|
||||||
|
ffi=FixedFileInfo(
|
||||||
|
# filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4)
|
||||||
|
# Set not needed items to zero 0.
|
||||||
|
filevers=({0}, {1}, {2}, 0),
|
||||||
|
prodvers=({0}, {1}, {2}, 0),
|
||||||
|
# Contains a bitmask that specifies the valid bits 'flags'r
|
||||||
|
mask=0x3f,
|
||||||
|
# Contains a bitmask that specifies the Boolean attributes of the file.
|
||||||
|
flags=0x0,
|
||||||
|
# The operating system for which this file was designed.
|
||||||
|
# 0x4 - NT and there is no need to change it.
|
||||||
|
OS=0x40004,
|
||||||
|
# The general type of file.
|
||||||
|
# 0x1 - the file is an application.
|
||||||
|
fileType=0x1,
|
||||||
|
# The function of the file.
|
||||||
|
# 0x0 - the function is not defined for this fileType
|
||||||
|
subtype=0x0,
|
||||||
|
# Creation date and time stamp.
|
||||||
|
date=(0, 0)
|
||||||
|
),
|
||||||
|
kids=[
|
||||||
|
StringFileInfo(
|
||||||
|
[
|
||||||
|
StringTable(
|
||||||
|
u'040904B0',
|
||||||
|
[StringStruct(u'CompanyName', u'Hardcoded Software'),
|
||||||
|
StringStruct(u'FileDescription', u'dupeGuru is a tool to find duplicate files on your computer.'),
|
||||||
|
StringStruct(u'FileVersion', u'{0}.{1}.{2}.0'),
|
||||||
|
StringStruct(u'InternalName', u'dupeGuru'),
|
||||||
|
StringStruct(u'LegalCopyright', u'© Hardcoded Software'),
|
||||||
|
StringStruct(u'OriginalFilename', u'dupeguru-win{3}.exe'),
|
||||||
|
StringStruct(u'ProductName', u'dupeGuru'),
|
||||||
|
StringStruct(u'ProductVersion', u'{0}.{1}.{2}.0')])
|
||||||
|
]),
|
||||||
|
VarFileInfo([VarStruct(u'Translation', [1033, 1200])])
|
||||||
|
]
|
||||||
|
)
|
Loading…
Reference in New Issue