diff options
author | Katja Marttila <katja.marttila@qt.io> | 2022-09-22 15:40:14 +0300 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2022-10-20 12:07:51 +0300 |
commit | f5dff60486e4d6ef355e1420226f1d059b0e441d (patch) | |
tree | 63bde6b764d7887f59382ee550551508531d0926 /src/libs/ifwtools/binarycreator.cpp | |
parent | a9b7904472b8172f82e751999837b16082731a76 (diff) |
Allow generation and signing of MT in macos
Previously maintenance tool could be updated from online repository
placing installerbase to repository and setting setInstallerBaseBinary()
in install script. The maintenancetool app bundle was written in the
code and installerbase placed under .app/Contents/MacOS/. This prevented
the maintenancetool app bundle to be signed and notarized.
Fixed so that the whole app bundle can be placed to repository. This
does not break the signing nor notarization as the whole bundle is
copied as it is. The setInstallerBaseBinary() is still needed in the
install script so that the installer knows which bundle is the
maintenance tool. Old way of updating maintenancetool still exists, if
the installerbaseBinary does not contain the ending 'app' installer
assumes that the maintenance tool is the executable itself instead of
whole app bundle.
This change also adds a new binarycreator switch
--create-maintenancetool, which can be used in macos to create the app
bundle for maintenance tool.
Task-number: QTIFW-2750
Change-Id: I3483ddb815d035644e826559947f6f9de4af9361
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src/libs/ifwtools/binarycreator.cpp')
-rw-r--r-- | src/libs/ifwtools/binarycreator.cpp | 72 |
1 files changed, 45 insertions, 27 deletions
diff --git a/src/libs/ifwtools/binarycreator.cpp b/src/libs/ifwtools/binarycreator.cpp index 5bef651a8..d7adc2a52 100644 --- a/src/libs/ifwtools/binarycreator.cpp +++ b/src/libs/ifwtools/binarycreator.cpp @@ -223,7 +223,7 @@ static QVersionNumber readMachOMinimumSystemVersion(QIODevice *device) } #endif -static int assemble(Input input, const QInstaller::Settings &settings, const QString &signingIdentity) +static int assemble(Input input, const QInstaller::Settings &settings, const BinaryCreatorArgs &args) { #ifdef Q_OS_MACOS if (QInstaller::isInBundle(input.installerExePath)) { @@ -405,22 +405,26 @@ static int assemble(Input input, const QInstaller::Settings &settings, const QSt QInstaller::appendData(&out, &exe, exe.size()); #endif - foreach (const QInstallerTools::PackageInfo &info, input.packages) { - QInstaller::ResourceCollection collection; - collection.setName(info.name.toUtf8()); - - qDebug() << "Creating resource archive for" << info.name; - foreach (const QString &copiedFile, info.copiedFiles) { - const QSharedPointer<Resource> resource(new Resource(copiedFile)); - qDebug().nospace() << "Appending " << copiedFile << " (" << humanReadableSize(resource->size()) << ")"; - collection.appendResource(resource); + if (!args.createMaintenanceTool) { + foreach (const QInstallerTools::PackageInfo &info, input.packages) { + QInstaller::ResourceCollection collection; + collection.setName(info.name.toUtf8()); + qDebug() << "Creating resource archive for" << info.name; + foreach (const QString &copiedFile, info.copiedFiles) { + const QSharedPointer<Resource> resource(new Resource(copiedFile)); + qDebug().nospace() << "Appending " << copiedFile << " (" << humanReadableSize(resource->size()) << ")"; + collection.appendResource(resource); + } + input.manager.insertCollection(collection); } - input.manager.insertCollection(collection); + + const QList<QInstaller::OperationBlob> operations; + BinaryContent::writeBinaryContent(&out, operations, input.manager, + BinaryContent::MagicInstallerMarker, BinaryContent::MagicCookie); + } else { + createMTDatFile(out); } - const QList<QInstaller::OperationBlob> operations; - BinaryContent::writeBinaryContent(&out, operations, input.manager, - BinaryContent::MagicInstallerMarker, BinaryContent::MagicCookie); } catch (const Error &e) { qCritical("Error occurred while assembling the installer: %s", qPrintable(e.message())); QFile::remove(tempFile); @@ -445,14 +449,14 @@ static int assemble(Input input, const QInstaller::Settings &settings, const QSt QFile::remove(tempFile); #ifdef Q_OS_MACOS - if (isBundle && !signingIdentity.isEmpty()) { + if (isBundle && !args.signingIdentity.isEmpty()) { qDebug() << "Signing .app bundle..."; QProcess p; p.start(QLatin1String("codesign"), QStringList() << QLatin1String("--force") << QLatin1String("--deep") - << QLatin1String("--sign") << signingIdentity + << QLatin1String("--sign") << args.signingIdentity << bundle); if (!p.waitForFinished(-1)) { @@ -503,8 +507,6 @@ static int assemble(Input input, const QInstaller::Settings &settings, const QSt QDir(bundle).removeRecursively(); qDebug() << "done."; } -#else - Q_UNUSED(signingIdentity) #endif return EXIT_SUCCESS; } @@ -754,7 +756,7 @@ int QInstallerTools::createBinary(BinaryCreatorArgs args, QString &argumentError "--offline-only at the same time."); return EXIT_FAILURE; } - if (args.target.isEmpty() && !args.compileResource) { + if (args.target.isEmpty() && !args.compileResource && !args.createMaintenanceTool) { argumentError = QString::fromLatin1("Error: Target parameter missing."); return EXIT_FAILURE; } @@ -762,7 +764,9 @@ int QInstallerTools::createBinary(BinaryCreatorArgs args, QString &argumentError argumentError = QString::fromLatin1("Error: No configuration file selected."); return EXIT_FAILURE; } - if (args.packagesDirectories.isEmpty() && args.repositoryDirectories.isEmpty() && !args.compileResource) { + if (args.packagesDirectories.isEmpty() && args.repositoryDirectories.isEmpty() + && !args.compileResource + && !args.createMaintenanceTool) { argumentError = QString::fromLatin1("Error: Both Package directory and Repository parameters missing."); return EXIT_FAILURE; } @@ -838,11 +842,6 @@ int QInstallerTools::createBinary(BinaryCreatorArgs args, QString &argumentError confInternal.setValue(QLatin1String("offlineOnly"), args.offlineOnly); } -#ifdef Q_OS_MACOS - // on mac, we enforce building a bundle - if (!args.target.endsWith(QLatin1String(".app")) && !args.target.endsWith(QLatin1String(".dmg"))) - args.target += QLatin1String(".app"); -#endif if (!args.compileResource) { // 5; put the copied resources into a resource file ResourceCollection metaCollection("QResources"); @@ -852,11 +851,20 @@ int QInstallerTools::createBinary(BinaryCreatorArgs args, QString &argumentError input.manager.insertCollection(metaCollection); input.packages = packages; - input.outputPath = args.target; + if (args.createMaintenanceTool) + input.outputPath = settings.maintenanceToolName(); + else + input.outputPath = args.target; input.installerExePath = args.templateBinary; +#ifdef Q_OS_MACOS + // on mac, we enforce building a bundle + if (!input.outputPath.endsWith(QLatin1String(".app")) && !input.outputPath.endsWith(QLatin1String(".dmg"))) + input.outputPath += QLatin1String(".app"); +#endif + qDebug() << "Creating the binary"; - exitCode = assemble(input, settings, args.signingIdentity); + exitCode = assemble(input, settings, args); } else { createDefaultResourceFile(tmpMetaDir, QDir::currentPath() + QLatin1String("/update.rcc")); exitCode = EXIT_SUCCESS; @@ -878,3 +886,13 @@ int QInstallerTools::createBinary(BinaryCreatorArgs args, QString &argumentError return exitCode; } + +void QInstallerTools::createMTDatFile(QFile &datFile) +{ + QInstaller::appendInt64(&datFile, 0); // operations start + QInstaller::appendInt64(&datFile, 0); // operations end + QInstaller::appendInt64(&datFile, 0); // resource count + QInstaller::appendInt64(&datFile, 4 * sizeof(qint64)); // data block size + QInstaller::appendInt64(&datFile, BinaryContent::MagicUninstallerMarker); + QInstaller::appendInt64(&datFile, BinaryContent::MagicCookie); +} |