diff --git a/builders/builder.py b/builders/builder.py index e3cc5ee..0139c4b 100644 --- a/builders/builder.py +++ b/builders/builder.py @@ -65,8 +65,8 @@ class Builder(object): self.setup_args() self.setup_system_paths() self.read_config() - self.setup_executables() self.setup_paths() + self.setup_executables() self.setup_extra() def _print(self, text, *args): @@ -264,6 +264,12 @@ class Builder(object): self._bzr('export', self.branch_path, ['-r', 'tag:' + self.version, self.work_path], 'Error exporting the code') + def get_extra_parameters(self): + """ + Return a list of any extra parameters we wish to use + """ + return [] + def run_pyinstaller(self): """ Run PyInstaller on the branch to build an executable. @@ -280,6 +286,7 @@ class Builder(object): '--runtime-hook', os.path.join(self.hooks_path, 'rthook_ssl.py'), '-i', self.icon_path, '-n', 'OpenLP', + *self.get_extra_parameters(), # Adds any extra parameters we wish to use self.openlp_script] if self.args.verbose: cmd.append('--log-level=DEBUG') @@ -365,6 +372,33 @@ class Builder(object): self._print_verbose('... %s', filename) copy(os.path.join(root, filename), os.path.join(dest_path, filename)) + def copy_font_files(self): + """ + Copy OpenLP font files + """ + self._print('Copying OpenLP fonts files...') + src_dir = os.path.join(self.source_path, 'core', 'ui', 'fonts') + dst_dir = os.path.join(self.dist_path, 'core', 'ui', 'fonts') + font_files = ['OpenLP.ttf', 'openlp-charmap.json'] + os.makedirs(dst_dir) + for font_file in font_files: + src = os.path.join(src_dir, font_file) + dst = os.path.join(dst_dir, font_file) + copy(src, dst) + + def copy_display_files(self): + """ + Copy OpenLP display HTML files + """ + self._print('Copying OpenLP HTML display files...') + src_dir = os.path.join(self.source_path, 'core', 'display', 'html') + dst_dir = os.path.join(self.dist_path, 'core', 'display', 'html') + os.makedirs(dst_dir) + for display_file in os.listdir(src_dir): + src = os.path.join(src_dir, display_file) + dst = os.path.join(dst_dir, display_file) + copy(src, dst) + def copy_extra_files(self): """ Copy any extra files which are particular to a platform @@ -461,6 +495,8 @@ class Builder(object): self.copy_default_theme() self.copy_plugins() self.copy_media_player() + self.copy_font_files() + self.copy_display_files() if os.path.exists(self.manual_path): self.run_sphinx() else: diff --git a/builders/windows-builder.py b/builders/windows-builder.py index a0086f3..054a2c6 100644 --- a/builders/windows-builder.py +++ b/builders/windows-builder.py @@ -26,12 +26,11 @@ Windows Build Script This script is used to build the Windows binary and the accompanying installer. For this script to work out of the box, it depends on a number of things: -Python 3.4 +Python 3.7 PyQt5 You should already have this installed, OpenLP doesn't work without it. The - version the script expects is the packaged one available from River Bank - Computing. + version the script expects is the packaged one available from pypi. PyEnchant This script expects the precompiled, installable version of PyEnchant to be @@ -48,8 +47,7 @@ HTML Help Workshop This is used to create the help file. PyInstaller - PyInstaller should be a git clone of - https://github.com/matysek/pyinstaller branch develop + PyInstaller can be installed from pypi. Bazaar You need the command line "bzr" client installed. @@ -59,10 +57,6 @@ OpenLP shared repository directory. This means your code should be in a directory structure like this: "openlp\\branch-name". -Visual C++ 2008 Express Edition - This is to build pptviewlib.dll, the library for controlling the - PowerPointViewer. - windows-builder.py This script, of course. It should be in the "windows-installer" directory at the same level as OpenLP trunk. @@ -115,6 +109,8 @@ Portable App Builds """ import os +import glob +import sys from distutils import dir_util from shutil import copy, move, rmtree @@ -126,17 +122,6 @@ class WindowsBuilder(Builder): The :class:`WindowsBuilder` class encapsulates everything that is needed to build a Windows installer. """ - def _build_pptviewlib(self): - """ - Build the PowerPoint Viewer DLL using Visual Studio. - """ - self._print('Building PPTVIEWLIB.DLL...') - if not os.path.exists(self.vcbuild_exe): - self._print('... WARNING: vcbuild.exe was not found, skipping building pptviewlib.dll') - return - self._run_command([self.vcbuild_exe, '/rebuild', os.path.join(self.pptviewlib_path, 'pptviewlib.vcproj'), - 'Release|Win32'], 'Error building pptviewlib.dll') - copy(os.path.join(self.pptviewlib_path, 'Release', 'pptviewlib.dll'), self.pptviewlib_path) def _create_innosetup_file(self): """ @@ -283,7 +268,13 @@ class WindowsBuilder(Builder): super().setup_system_paths() self.python_root = os.path.dirname(self.python) self.site_packages = os.path.join(self.python_root, 'Lib', 'site-packages') - self.program_files = os.getenv('PROGRAMFILES') + # Default program_files to 'Program Files (x86)' - the folder for 32-bit programs on 64-bit systems, if that + # does not exists the host system is 32-bit so fallback to 'Program Files'. + self.program_files = os.getenv('PROGRAMFILES(x86)') + if not self.program_files: + self.program_files = os.getenv('PROGRAMFILES') + self._print_verbose(' {:.<20}: {}'.format('site packages: ', self.site_packages)) + self._print_verbose(' {:.<20}: {}'.format('program files: ', self.program_files)) def setup_paths(self): """ @@ -293,7 +284,6 @@ class WindowsBuilder(Builder): self.dist_path = os.path.join(self.work_path, 'dist', 'OpenLP') self.helpfile_path = os.path.join(self.manual_build_path, 'htmlhelp') self.winres_path = os.path.join(self.branch_path, 'resources', 'windows') - self.pptviewlib_path = os.path.join(self.source_path, 'plugins', 'presentations', 'lib', 'pptviewlib') def copy_extra_files(self): """ @@ -334,12 +324,25 @@ class WindowsBuilder(Builder): """ Build the installer """ - self._build_pptviewlib() self._create_innosetup_file() self._run_innosetup() if self.args.portable: self._run_portableapp_builder() + def get_extra_parameters(self): + """ + Return a list of any extra parameters we wish to use + """ + parameters = [] + # Detect python instance bit size + arch = 'x86' if sys.maxsize == 0x7fffffff else 'x64' + dll_path = '{pf}\\Windows Kits\\10\\Redist\\ucrt\\DLLs\\{arch}\\*.dll'.format(pf=self.program_files, arch=arch) + # Finds the UCRT DDLs available from the Windows 10 SDK + for binary in glob.glob(dll_path): + parameters.append('--add-binary') + parameters.append(binary + ";.") + return parameters + if __name__ == '__main__': WindowsBuilder().main() diff --git a/windows/config-appveyor.ini b/windows/config-appveyor.ini index 8161e61..9dd0298 100644 --- a/windows/config-appveyor.ini +++ b/windows/config-appveyor.ini @@ -1,18 +1,17 @@ [executables] innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe sphinx = %(pyroot)s\Scripts\sphinx-build.exe -pyinstaller = %(here)s\..\..\PyInstaller-3.2\pyinstaller.py -vcbuild = %(progfiles)s\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe +pyinstaller = %(pyroot)s\Scripts\pyinstaller-script.py htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe psvince = %(here)s\psvince.dll -lrelease = C:\Qt\5.5\msvc2013\bin\lrelease.exe +lrelease = C:\Qt\5.12\msvc2017\bin\lrelease.exe portablelauncher = %(here)s\..\..\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe portableinstaller = %(here)s\..\..\PortableApps.comInstaller\PortableApps.comInstaller.exe -mutool = %(here)s\..\..\mupdf-1.9a-windows\mutool.exe +mutool = %(here)s\..\..\mupdf-1.14.0-windows\mutool.exe mediainfo = %(here)s\..\..\MediaInfo\MediaInfo.exe [paths] -branch = %(projects)s\trunk +branch = %(projects)s\openlp-branch documentation = %(projects)s\documentation icon = %(here)s\OpenLP.ico hooks = %(here)s\..\pyinstaller-hooks diff --git a/windows/config.ini.default b/windows/config.ini.default index d335ff4..443cab4 100644 --- a/windows/config.ini.default +++ b/windows/config.ini.default @@ -2,7 +2,6 @@ innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe sphinx = %(pyroot)s\Scripts\sphinx-build.exe pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py -vcbuild = %(progfiles)s\Microsoft Visual Studio 9.0\VC\vcpackages\vcbuild.exe htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe psvince = %(here)s\psvince.dll lrelease = %(sitepackages)s\PyQt5\bin\lrelease.exe