diff --git a/bin/Packager/MultiCollectionPackager.py b/bin/Packager/MultiCollectionPackager.py deleted file mode 100644 --- a/bin/Packager/MultiCollectionPackager.py +++ /dev/null @@ -1,31 +0,0 @@ -from .CollectionPackagerBase import * -from .PortablePackager import * -from .NullsoftInstallerPackager import * - - -class MultiCollectionPackager(PortablePackager, NullsoftInstallerPackager): - @InitGuard.init_once - def __init__(self, whitelists=None, blacklists=None): - PortablePackager.__init__(self, whitelists, blacklists) - NullsoftInstallerPackager.__init__(self, whitelists, blacklists) - - def createPackage(self): - if "setupname" in self.defines: - CraftCore.log.error("MultiCollectionPackager doesn't support a custome setupname") - return False - - if not self.isNsisInstalled(): - return False - if not self.internalCreatePackage(): - return False - - # redist is directly included by libs/runtime - self.defines["vcredist"] = "none" - setupname = self.generateNSISInstaller() - destDir, archiveName = os.path.split(setupname) - self._generateManifest(destDir, archiveName) - CraftHash.createDigestFiles(setupname) - - setupname = self.createPortablePackage() - CraftHash.createDigestFiles(setupname) - return True diff --git a/bin/Packager/NullsoftInstaller.nsi b/bin/Packager/NullsoftInstaller.nsi --- a/bin/Packager/NullsoftInstaller.nsi +++ b/bin/Packager/NullsoftInstaller.nsi @@ -38,8 +38,6 @@ ShowInstDetails hide ShowUninstDetails hide -SetCompressor /SOLID lzma - Name "@{productname}" Caption "@{productname} @{version}" @@ -121,8 +119,13 @@ ; package all files, recursively, preserving attributes ; assume files are in the correct places -File /a /r "@{srcdir}\*.*" +File /a "@{dataPath}" +File /a "@{7za}" File /a "@{icon}" +nsExec::ExecToLog '"$INSTDIR\7za.exe" x -r -y "$INSTDIR\@{dataName}" -o"$INSTDIR"' +Delete "$INSTDIR\7za.exe" +Delete "$INSTDIR\@{dataName}" + WriteUninstaller "${uninstaller}" @@ -137,15 +140,6 @@ CreateShortCut "${startmenu}\Uninstall.lnk" "$INSTDIR\uninstall.exe" SectionEnd -;post install -Section -SetOutPath "$INSTDIR" -!if "@{vcredist}" != "none" - File /a /oname=vcredist.exe "@{vcredist}" - ExecWait '"$INSTDIR\vcredist.exe" /passive /norestart' -!endif -Delete "$INSTDIR\vcredist.exe" -SectionEnd ; Uninstaller ; All section names prefixed by "Un" will be in the uninstaller @@ -155,7 +149,7 @@ Section "Uninstall" SetShellVarContext all ; TODO: we need something independent of a tier3.... -ExecWait '"$INSTDIR\bin\kdeinit5.exe" "--shutdown"' +nsExec::ExecToLog '"$INSTDIR\bin\kdeinit5.exe" "--shutdown"' DeleteRegKey @{HKLM} "${uninstkey}" DeleteRegKey @{HKLM} "${regkey}" diff --git a/bin/Packager/NullsoftInstallerPackager.py b/bin/Packager/NullsoftInstallerPackager.py --- a/bin/Packager/NullsoftInstallerPackager.py +++ b/bin/Packager/NullsoftInstallerPackager.py @@ -28,10 +28,11 @@ from Utils import CraftHash from Packager.CollectionPackagerBase import * +from Packager.PortablePackager import * from Blueprints.CraftVersion import CraftVersion -class NullsoftInstallerPackager(CollectionPackagerBase): +class NullsoftInstallerPackager(PortablePackager): """ Packager for Nullsoft scriptable install system @@ -60,7 +61,7 @@ @InitGuard.init_once def __init__(self, whitelists=None, blacklists=None): - CollectionPackagerBase.__init__(self, whitelists, blacklists) + PortablePackager.__init__(self, whitelists, blacklists) self.nsisExe = None self._isInstalled = False @@ -77,8 +78,6 @@ defines.setdefault("version", self.sourceRevision() if self.subinfo.hasSvnTarget() else self.version) defines.setdefault("website", self.subinfo.webpage if self.subinfo.webpage else "https://community.kde.org/Craft") defines.setdefault("registy_hook", "") - # runtime distributable files - defines.setdefault("vcredist", self.getVCRedistLocation()) if not self.scriptname: self.scriptname = os.path.join(os.path.dirname(__file__), "NullsoftInstaller.nsi") @@ -112,38 +111,17 @@ _path = os.path.join(os.path.dirname(shutil.which("cl.exe")), "..", "..", "redist") return _path - @staticmethod - def getVCRedistLocation(): - if not CraftCore.compiler.isMSVC(): - return "none" - _file = None - if CraftCore.compiler.isMSVC(): - arch = "x86" - if CraftCore.compiler.isX64(): - arch = "x64" - - # TODO: This needs to be made more fail-safe: the version numbers can change with any VS upgrade... - if CraftCore.compiler.isMSVC2015(): - _file = os.path.join(NullsoftInstallerPackager.getVCRuntimeLibrariesLocation(), "1033", f"vcredist_{arch}.exe") - elif CraftCore.compiler.isMSVC2017(): - for name in [f"vcredist_{arch}.exe", f"vc_redist.{arch}.exe"]: - _file = os.path.join(os.environ["VCTOOLSREDISTDIR"], name) - if os.path.isfile(_file): - break - - if not os.path.isfile(_file): - CraftCore.debug.new_line() - CraftCore.log.critical( - "Assuming we can't find a c++ redistributable because the user hasn't got one. Must be fixed manually.") - return _file - def _createShortcut(self, name, target, icon="", parameter="", description="") -> str: return f"""CreateShortCut "${{startmenu}}\\{name}.lnk" "$INSTDIR\\{OsUtils.toNativePath(target)}" "{parameter}" "{icon}" 0 SW_SHOWNORMAL "" "{description}"\n""" def generateNSISInstaller(self): """ runs makensis to generate the installer itself """ defines = self._setDefaults(self.defines) + defines["dataPath"] = self.setupName + defines["dataName"] = os.path.basename(self.setupName) + defines["7za"] = CraftCore.cache.findApplication("7za") + defines["installerIcon"] = f"""!define MUI_ICON "{defines["icon"]}" """ defines["iconname"] = os.path.basename(defines["icon"]) if not defines["license"] == "": @@ -167,9 +145,10 @@ if not os.path.isabs(defines["setupname"]): dstpath = self.packageDestinationDir() defines["setupname"] = os.path.join(dstpath, defines["setupname"]) + self.setupName = defines["setupname"] CraftCore.debug.new_line() - CraftCore.log.debug("generating installer %s" % defines["setupname"]) + CraftCore.log.debug(f"generating installer {self.setupName}") verboseString = "/V4" if CraftCore.debug.verbose() > 0 else "/V3" @@ -185,27 +164,22 @@ if not utils.systemWithoutShell([self.nsisExe, verboseString] + cmdDefines + [configuredScrip], cwd=os.path.abspath(self.packageDir())): CraftCore.log.critical("Error in makensis execution") - return None - if not utils.sign([defines["setupname"]]): - return None - return defines["setupname"] + return False + return utils.sign([self.setupName]) def createPackage(self): """ create a package """ if not self.isNsisInstalled(): return False CraftCore.log.debug("packaging using the NullsoftInstallerPackager") - if CraftCore.compiler.isMSVC(): - # we use the redist installer - self.ignoredPackages.append("libs/runtime") - if not self.internalCreatePackage(): + if not super().createPackage(): return False - setupname = self.generateNSISInstaller() - if not setupname: + if not self.generateNSISInstaller(): return False - destDir, archiveName = os.path.split(setupname) + + destDir, archiveName = os.path.split(self.setupName) self._generateManifest(destDir, archiveName) - CraftHash.createDigestFiles(setupname) + CraftHash.createDigestFiles(self.setupName) return True diff --git a/bin/Packager/PortablePackager.py b/bin/Packager/PortablePackager.py --- a/bin/Packager/PortablePackager.py +++ b/bin/Packager/PortablePackager.py @@ -14,29 +14,28 @@ def __init__(self, whitelists=None, blacklists=None): SevenZipPackager.__init__(self) CollectionPackagerBase.__init__(self, whitelists, blacklists) + self.setupName = None - def createPortablePackage(self) -> str: + def createPortablePackage(self) -> bool: """create portable 7z package with digest files located in the manifest subdir""" - setupname = self.defines.get("setupname", os.path.join(self.packageDestinationDir(), self.binaryArchiveName(includeRevision=True))) + self.setupName = self.defines.get("setupname", os.path.join(self.packageDestinationDir(), self.binaryArchiveName(includeRevision=True))) + + if not os.path.isabs(self.setupName): + absSetupPath = os.path.join(self.packageDestinationDir(), self.setupName) + srcdir = self.defines.get("srcdir", self.archiveDir()) - if not self._compress(setupname, srcdir, self.packageDestinationDir()): - return None - return setupname + return self._compress(self.setupName, srcdir, self.packageDestinationDir()) def createPackage(self): """ create a package """ if not self.internalCreatePackage(): return False - absSetupPath = self.createPortablePackage() - if not absSetupPath: + if not self.createPortablePackage(): return False - if not os.path.isabs(absSetupPath): - absSetupPath = os.path.join(self.packageDestinationDir(), absSetupPath) - - CraftHash.createDigestFiles(absSetupPath) + CraftHash.createDigestFiles(self.setupName) return True diff --git a/bin/Packager/TypePackager.py b/bin/Packager/TypePackager.py --- a/bin/Packager/TypePackager.py +++ b/bin/Packager/TypePackager.py @@ -29,7 +29,6 @@ from Packager.NullsoftInstallerPackager import * from Packager.PortablePackager import * from Packager.SevenZipPackager import * -from Packager.MultiCollectionPackager import * from Packager.QtIFPackager import *