diff --git a/builders/windows-builder.py b/builders/windows-builder.py index 7ebb43c..d549933 100644 --- a/builders/windows-builder.py +++ b/builders/windows-builder.py @@ -37,7 +37,8 @@ PyEnchant installed. You can find this on the PyEnchant site. WiX Toolset - Inno Setup should be installed into "C:\\%PROGRAMFILES%\\Inno Setup 5" + The toolset should be installed into "C:\\%PROGRAMFILES%\\WiX Toolset v3.11" + or similar. Sphinx This is used to build the documentation. The documentation trunk must be at @@ -61,15 +62,6 @@ windows-builder.py This script, of course. It should be in the "windows-installer" directory at the same level as OpenLP trunk. -psvince.dll - This dll is used during the actual install of OpenLP to check if OpenLP is - running on the users machine prior to the setup. If OpenLP is running, - the install will fail. The dll can be obtained from here: - - http://www.vincenzo.net/isxkb/index.php?title=PSVince - - The dll is presently included with this script. - Mako Mako Templates for Python. This package is required for building the remote plugin. It can be installed by going to your @@ -83,11 +75,6 @@ MuPDF mupdf.com, extract it, and set the mutoolbin option in the config file to point to mutool.exe. -MediaInfo - Required for the media plugin. Download the 32-bit CLI windows build from - https://mediaarea.net/nn/MediaInfo/Download/Windows and set the - mediainfobin option in the config file to point to MediaInfo.exe. - Portable App Builds The following are required if you are planning to make a portable build of OpenLP. The portable build conforms to the standards published by @@ -120,10 +107,6 @@ from lxml.builder import E from builder import Builder -BLACKLIST = [ - 'pptviewlib.dll.intermediate.manifest' -] - class WindowsBuilder(Builder): """ @@ -169,8 +152,6 @@ class WindowsBuilder(Builder): parent_dir[base] = new_dir parent_dir['__dir__'].append(element) for fname in files: - if fname in BLACKLIST: - continue source = os.path.join(path, fname) if path else fname source_id = md5(source).hexdigest() file_id = 'file_{source_id}'.format(source_id=source_id) @@ -194,17 +175,19 @@ class WindowsBuilder(Builder): self._print_verbose('Reading base WiX file') with open(os.path.join(config_dir, 'OpenLP-base.wxs'), 'rt') as base_file: xml = base_file.read() + progfilefolder = 'ProgramFiles64Folder' if self.arch == 'x64' else 'ProgramFilesFolder' xml = xml % dict(dialog=os.path.join(config_dir, 'WizardMain.bmp'), - banner=os.path.join(config_dir, 'WizardBanner.bmp')) + banner=os.path.join(config_dir, 'WizardBanner.bmp'), + platform=self.arch, + progfilefolder=progfilefolder) tree = fromstring(xml.encode('utf8')) self._print_verbose('Creating XML fragments from files and directories') fragments = self._get_fragments_from_files(self.dist_path) self._print_verbose('Inserting XML fragments into base WiX file') - wix = tree.getroot() for fragment in fragments: - wix.append(fragment) + tree.append(fragment) self._print_verbose('Writing new WiX file') - with open(os.path.join(self.config_path, 'OpenLP.wxs'), 'wb') as f: + with open(os.path.join(config_dir, 'OpenLP.wxs'), 'wb') as f: f.write(tostring(tree, encoding='utf-8', xml_declaration=True, pretty_print=True)) def _run_wix_tools(self): @@ -213,7 +196,7 @@ class WindowsBuilder(Builder): """ self._print('Running WiX tools...') msi_file = os.path.join(self.dist_path, 'OpenLP-{}.msi'.format(self.version)) - if msi_file: + if os.path.exists(msi_file): self._print_verbose('Removing old MSI file') os.unlink(msi_file) config_dir = os.path.dirname(self.config_path) @@ -380,8 +363,6 @@ class WindowsBuilder(Builder): copy(self.icon_path, os.path.join(self.dist_path, 'OpenLP.ico')) self._print_verbose('... LICENSE.txt') copy(self.license_path, os.path.join(self.dist_path, 'LICENSE.txt')) - self._print_verbose('... psvince.dll') - copy(self.psvince_exe, os.path.join(self.dist_path, 'psvince.dll')) if os.path.isfile(os.path.join(self.helpfile_path, 'OpenLP.chm')): self._print_verbose('... OpenLP.chm') copy(os.path.join(self.helpfile_path, 'OpenLP.chm'), os.path.join(self.dist_path, 'OpenLP.chm')) @@ -392,11 +373,6 @@ class WindowsBuilder(Builder): copy(os.path.join(self.mutool_exe), os.path.join(self.dist_path, 'mutool.exe')) else: self._print('... WARNING: mutool.exe not found') - self._print_verbose('... MediaInfo.exe') - if self.mediainfo_exe and os.path.isfile(self.mediainfo_exe): - copy(os.path.join(self.mediainfo_exe), os.path.join(self.dist_path, 'MediaInfo.exe')) - else: - self._print('... WARNING: MediaInfo.exe not found') def after_run_sphinx(self): """ diff --git a/windows/OpenLP-base.wxs b/windows/OpenLP-base.wxs index ffda505..15365a8 100644 --- a/windows/OpenLP-base.wxs +++ b/windows/OpenLP-base.wxs @@ -5,7 +5,7 @@ UpgradeCode="{8C5881AC-8F1E-4937-BB99-B823FABF18F0}" Language="1033" Codepage="1252" Version="2.5.0"> + InstallerVersion="251" Languages="1033" Compressed="yes" SummaryCodepage="1252" Platform="%(platform)s"/> Privileged @@ -24,7 +24,7 @@ - + diff --git a/windows/OpenLP.iss.default b/windows/OpenLP.iss.default deleted file mode 100644 index 0543626..0000000 --- a/windows/OpenLP.iss.default +++ /dev/null @@ -1,187 +0,0 @@ -; Script generated by the Inno Setup Script Wizard. -; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! - -#define AppName "OpenLP" -#define AppVerName "OpenLP %(display_version)s" -#define AppVersion "%(display_version)s" -#define AppPublisher "OpenLP Developers" -#define AppURL "http://openlp.org/" -#define AppExeName "OpenLP.exe" -#define Arch "%(arch)s" - -#define FileHandle FileOpen("%(branch)s\dist\OpenLP\.version") -#define FileLine FileRead(FileHandle) -#define RealVersion FileLine -#expr FileClose(FileHandle) - -[Setup] -; NOTE: The value of AppId uniquely identifies this application. -; Do not use the same AppId value in installers for other applications. -; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) -AppID={{AA7699FA-B2D2-43F4-8A70-D497D03C9485} -AppName={#AppName} -AppVerName={cm:NameAndVersion,{#AppName},{#AppVersion}} -AppVersion={#AppVersion} -AppPublisher={#AppPublisher} -AppPublisherURL={#AppURL} -AppSupportURL={#AppURL} -AppUpdatesURL={#AppURL} -DefaultDirName={pf}\{#AppName} -DefaultGroupName={#AppName} -AllowNoIcons=true -LicenseFile=LICENSE.txt -OutputDir=%(branch)s\dist\ -OutputBaseFilename=OpenLP-{#RealVersion}-{#Arch}-setup -Compression=lzma/Max -SolidCompression=true -SetupIconFile=OpenLP.ico -VersionInfoVersion={#AppVersion} -WizardImageFile=WizImageBig.bmp -WizardSmallImageFile=WizImageSmall.bmp -ChangesAssociations=true - -[Languages] -Name: english; MessagesFile: compiler:Default.isl -Name: brazilianportuguese; MessagesFile: compiler:Languages\BrazilianPortuguese.isl -Name: catalan; MessagesFile: compiler:Languages\Catalan.isl -Name: czech; MessagesFile: compiler:Languages\Czech.isl -Name: danish; MessagesFile: compiler:Languages\Danish.isl -Name: dutch; MessagesFile: compiler:Languages\Dutch.isl -Name: finnish; MessagesFile: compiler:Languages\Finnish.isl -Name: french; MessagesFile: compiler:Languages\French.isl -Name: german; MessagesFile: compiler:Languages\German.isl -Name: hebrew; MessagesFile: compiler:Languages\Hebrew.isl -Name: hungarian; MessagesFile: compiler:Languages\Hungarian.isl -Name: italian; MessagesFile: compiler:Languages\Italian.isl -Name: japanese; MessagesFile: compiler:Languages\Japanese.isl -Name: norwegian; MessagesFile: compiler:Languages\Norwegian.isl -Name: polish; MessagesFile: compiler:Languages\Polish.isl -Name: portuguese; MessagesFile: compiler:Languages\Portuguese.isl -Name: russian; MessagesFile: compiler:Languages\Russian.isl -Name: slovenian; MessagesFile: compiler:Languages\Slovenian.isl -Name: spanish; MessagesFile: compiler:Languages\Spanish.isl - -[Tasks] -Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons} -Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; OnlyBelowVersion: 0, 6.1 - -[Files] -Source: %(branch)s\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs -; DLL used to check if the target program is running at install time -Source: psvince.dll; flags: dontcopy -; psvince is installed in {app} folder, so it will be loaded at -; uninstall time to check if the target program is running -Source: psvince.dll; DestDir: {app} - -[Icons] -Name: {group}\{#AppName}; Filename: {app}\{#AppExeName} -Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug -Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm')) -Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL} -Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe} -Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon -Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: quicklaunchicon - -[Run] -Filename: {app}\{#AppExeName}; Description: {cm:LaunchProgram,{#AppName}}; Flags: nowait postinstall skipifsilent - -[Registry] -Root: HKCR; Subkey: .osz; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue -Root: HKCR; Subkey: .oszl; ValueType: string; ValueName: ; ValueData: OpenLP; Flags: uninsdeletevalue -Root: HKCR; Subkey: OpenLP; ValueType: string; ValueName: ; ValueData: OpenLP Service; Flags: uninsdeletekey -Root: HKCR; Subkey: OpenLP\DefaultIcon; ValueType: string; ValueName: ; ValueData: {app}\OpenLP.exe,0 -Root: HKCR; Subkey: OpenLP\shell\open\command; ValueType: string; ValueName: ; ValueData: """{app}\OpenLP.exe"" ""%1""" - -[UninstallDelete] -; Remove support directory created when program is run: -Type: filesandordirs; Name: {app}\support -; Remove program directory if empty: -Name: {app}; Type: dirifempty - -[Code] -// Function to call psvince.dll at install time -function IsModuleLoadedInstall(modulename: AnsiString ): Boolean; -external 'IsModuleLoaded@files:psvince.dll stdcall setuponly'; - -// Function to call psvince.dll at uninstall time -function IsModuleLoadedUninstall(modulename: AnsiString ): Boolean; -external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly' ; - -function GetUninstallString(): String; -var - sUnInstPath: String; - sUnInstallString: String; -begin - sUnInstPath := ExpandConstant('Software\Microsoft\Windows\CurrentVersion\Uninstall\{#emit SetupSetting("AppId")}_is1'); - sUnInstallString := ''; - if not RegQueryStringValue(HKLM, sUnInstPath, 'UninstallString', sUnInstallString) then - RegQueryStringValue(HKCU, sUnInstPath, 'UninstallString', sUnInstallString); - Result := sUnInstallString; -end; - -function IsUpgrade(): Boolean; -begin - Result := (GetUninstallString() <> ''); -end; - -// Return Values: -// 1 - uninstall string is empty -// 2 - error executing the UnInstallString -// 3 - successfully executed the UnInstallString -function UnInstallOldVersion(): Integer; -var - sUnInstallString: String; - iResultCode: Integer; -begin - Result := 0; - sUnInstallString := GetUninstallString(); - if sUnInstallString <> '' then - begin - sUnInstallString := RemoveQuotes(sUnInstallString); - if Exec(sUnInstallString, '/SILENT /NORESTART /SUPPRESSMSGBOXES','', SW_HIDE, ewWaitUntilTerminated, iResultCode) then - Result := 3 - else - Result := 2; - end - else - Result := 1; -end; - -function InitializeSetup(): Boolean; -begin - Result := true; - while IsModuleLoadedInstall( 'OpenLP.exe' ) and Result do - begin - if MsgBox( 'Openlp is currently running, please close it to continue the install.', - mbError, MB_OKCANCEL ) = IDCANCEL then - begin - Result := false; - end; - end; -end; - -procedure CurStepChanged(CurStep: TSetupStep); -begin - if (CurStep=ssInstall) then - begin - if (IsUpgrade()) then - begin - UnInstallOldVersion(); - end; - end; -end; - -function InitializeUninstall(): Boolean; -begin - Result := true; - while IsModuleLoadedUninstall( 'OpenLP.exe' ) and Result do - begin - if MsgBox( 'Openlp is currently running, please close it to continue the uninstall.', - mbError, MB_OKCANCEL ) = IDCANCEL then - begin - Result := false; - end; - end; -// Unload psvince.dll, otherwise it is not deleted - UnloadDLL(ExpandConstant('{app}\psvince.dll')); -end; diff --git a/windows/config-appveyor.ini b/windows/config-appveyor.ini index 9dd0298..0288d0c 100644 --- a/windows/config-appveyor.ini +++ b/windows/config-appveyor.ini @@ -1,14 +1,13 @@ [executables] -innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe sphinx = %(pyroot)s\Scripts\sphinx-build.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.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.14.0-windows\mutool.exe -mediainfo = %(here)s\..\..\MediaInfo\MediaInfo.exe +candle = %(progfiles)s\WiX Toolset v3.11\bin\candle.exe +light = %(progfiles)s\WiX Toolset v3.11\bin\light.exe [paths] branch = %(projects)s\openlp-branch diff --git a/windows/config.ini.default b/windows/config.ini.default index 443cab4..0929567 100644 --- a/windows/config.ini.default +++ b/windows/config.ini.default @@ -1,22 +1,21 @@ [executables] -innosetup = %(progfiles)s\Inno Setup 5\ISCC.exe sphinx = %(pyroot)s\Scripts\sphinx-build.exe pyinstaller = %(here)s\..\pyinstaller\pyinstaller.py htmlhelp = %(progfiles)s\HTML Help Workshop\hhc.exe -psvince = %(here)s\psvince.dll lrelease = %(sitepackages)s\PyQt5\bin\lrelease.exe portablelauncher = %(progfiles)s\PortableApps.comLauncher\PortableApps.comLauncherGenerator.exe portableinstaller = %(progfiles)s\PortableApps.comInstaller\PortableApps.comInstaller.exe mutool = %(here)s\..\mupdf-1.9a-windows\mutool.exe -mediainfo = %(here)s\..\MediaInfo\MediaInfo.exe +candle = %(progfiles)s\WiX Toolset v3.11\bin\candle.exe +light = %(progfiles)s\WiX Toolset v3.11\bin\light.exe [paths] branch = %(projects)s\trunk documentation = %(projects)s\documentation -icon = %(here)s\OpenLP.ico -hooks = %(here)s\..\pyinstaller-hooks +icon = %(here)s\windows\OpenLP.ico +hooks = %(here)s\pyinstaller-hooks license = %(here)s\LICENSE.txt -portable_source = %(here)s\OpenLPPortable +portable_source = %(here)s\windows\OpenLPPortable portable_dest = %(projects)s\OpenLPPortable [transifex] diff --git a/windows/psvince.dll b/windows/psvince.dll deleted file mode 100644 index e910509..0000000 Binary files a/windows/psvince.dll and /dev/null differ