diff options
Diffstat (limited to 'tools/binarycreator/binarycreator.cpp')
-rw-r--r-- | tools/binarycreator/binarycreator.cpp | 100 |
1 files changed, 78 insertions, 22 deletions
diff --git a/tools/binarycreator/binarycreator.cpp b/tools/binarycreator/binarycreator.cpp index 8687f7b1d..7ffbe9bc9 100644 --- a/tools/binarycreator/binarycreator.cpp +++ b/tools/binarycreator/binarycreator.cpp @@ -98,7 +98,7 @@ static void chmod755(const QString &absolutFilePath) } #endif -static int assemble(Input input, const QInstaller::Settings &settings) +static int assemble(Input input, const QInstaller::Settings &settings, const QString &signingIdentity) { #ifdef Q_OS_OSX if (QInstaller::isInBundle(input.installerExePath)) { @@ -193,7 +193,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) QTemporaryFile file(input.outputPath); if (!file.open()) { - throw Error(QString::fromLatin1("Could not copy %1 to %2: %3").arg(input.installerExePath, + throw Error(QString::fromLatin1("Cannot copy %1 to %2: %3").arg(input.installerExePath, input.outputPath, file.errorString())); } @@ -203,7 +203,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) QFile instExe(input.installerExePath); if (!instExe.copy(tempFile)) { - throw Error(QString::fromLatin1("Could not copy %1 to %2: %3").arg(instExe.fileName(), + throw Error(QString::fromLatin1("Cannot copy %1 to %2: %3").arg(instExe.fileName(), tempFile, instExe.errorString())); } @@ -228,7 +228,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) chmod755(copyscript); QProcess p; p.start(copyscript, QStringList() << bundle); - p.waitForFinished(); + p.waitForFinished(-1); QFile::rename(input.outputPath, tempFile); QFile::remove(copyscript); } @@ -246,7 +246,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) { QFile target(targetName); if (target.exists() && !target.remove()) { - qCritical("Could not remove target %s: %s", qPrintable(target.fileName()), + qCritical("Cannot remove target %s: %s", qPrintable(target.fileName()), qPrintable(target.errorString())); QFile::remove(tempFile); return EXIT_FAILURE; @@ -259,7 +259,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) #ifdef Q_OS_OSX if (!exe.copy(input.outputPath)) { - throw Error(QString::fromLatin1("Could not copy %1 to %2: %3").arg(exe.fileName(), + throw Error(QString::fromLatin1("Cannot copy %1 to %2: %3").arg(exe.fileName(), input.outputPath, exe.errorString())); } #else @@ -274,8 +274,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) qDebug() << "Creating resource archive for" << info.name; foreach (const QString &file, info.copiedFiles) { const QSharedPointer<Resource> resource(new Resource(file)); - qDebug() << QString::fromLatin1("Appending %1 (%2)").arg(file, - humanReadableSize(resource->size())); + qDebug().nospace() << "Appending " << file << " (" << humanReadableSize(resource->size()) << ")"; collection.appendResource(resource); } input.manager.insertCollection(collection); @@ -291,7 +290,7 @@ static int assemble(Input input, const QInstaller::Settings &settings) } if (!out.rename(targetName)) { - qCritical("Could not write installer to %s: %s", targetName.toUtf8().constData(), + qCritical("Cannot write installer to %s: %s", targetName.toUtf8().constData(), out.errorString().toUtf8().constData()); QFile::remove(tempFile); return EXIT_FAILURE; @@ -304,21 +303,66 @@ static int assemble(Input input, const QInstaller::Settings &settings) QFile::remove(tempFile); #ifdef Q_OS_OSX + if (isBundle && !signingIdentity.isEmpty()) { + qDebug() << "Signing .app bundle..."; + + QProcess p; + p.start(QLatin1String("codesign"), + QStringList() << QLatin1String("--force") + << QLatin1String("--deep") + << QLatin1String("--sign") << signingIdentity + << bundle); + + if (!p.waitForFinished(-1)) { + qCritical("Failed to sign app bundle: error while running '%s %s': %s", + p.program().toUtf8().constData(), + p.arguments().join(QLatin1Char(' ')).toUtf8().constData(), + p.errorString().toUtf8().constData()); + return EXIT_FAILURE; + } + + if (p.exitStatus() == QProcess::NormalExit) { + if (p.exitCode() != 0) { + qCritical("Failed to sign app bundle: running codesign failed " + "with exit code %d: %s", p.exitCode(), + p.readAllStandardError().constData()); + return EXIT_FAILURE; + } + } + + qDebug() << "done."; + } + bundleBackup.release(); if (createDMG) { qDebug() << "creating a DMG disk image..."; - // no error handling as this is not fatal - const QString mkdmgscript = QDir::temp().absoluteFilePath(QLatin1String("mkdmg.sh")); - QFile::copy(QLatin1String(":/resources/mkdmg.sh"), mkdmgscript); - chmod755(mkdmgscript); + const QString volumeName = QFileInfo(input.outputPath).fileName(); + const QString imagePath = QString::fromLatin1("%1/%2.dmg") + .arg(QFileInfo(bundle).path()) + .arg(volumeName); + + // no error handling as this is not fatal QProcess p; - p.start(mkdmgscript, QStringList() << QFileInfo(input.outputPath).fileName() << bundle); - p.waitForFinished(); - QFile::remove(mkdmgscript); - qDebug() << "done." << mkdmgscript; + p.start(QLatin1String("/usr/bin/hdiutil"), + QStringList() << QLatin1String("create") + << imagePath + << QLatin1String("-srcfolder") + << bundle + << QLatin1String("-ov") + << QLatin1String("-volname") + << volumeName + << QLatin1String("-fs") + << QLatin1String("HFS+")); + qDebug() << "running " << p.program() << p.arguments(); + p.waitForFinished(-1); + qDebug() << "removing" << bundle; + QDir(bundle).removeRecursively(); + qDebug() << "done."; } +#else + Q_UNUSED(signingIdentity) #endif return EXIT_SUCCESS; } @@ -367,7 +411,7 @@ static QSharedPointer<QInstaller::Resource> createDefaultResourceFile(const QStr { QTemporaryFile projectFile(directory + QLatin1String("/rccprojectXXXXXX.qrc")); if (!projectFile.open()) - throw Error(QString::fromLatin1("Could not create temporary file for generated rcc project file")); + throw Error(QString::fromLatin1("Cannot create temporary file for generated rcc project file")); projectFile.close(); const WorkingDirectoryChange wd(directory); @@ -376,13 +420,13 @@ static QSharedPointer<QInstaller::Resource> createDefaultResourceFile(const QStr // 1. create the .qrc file if (runRcc(QStringList() << QLatin1String("rcc") << QLatin1String("-project") << QLatin1String("-o") << projectFileName) != EXIT_SUCCESS) { - throw Error(QString::fromLatin1("Could not create rcc project file.")); + throw Error(QString::fromLatin1("Cannot create rcc project file.")); } // 2. create the binary resource file from the .qrc file if (runRcc(QStringList() << QLatin1String("rcc") << QLatin1String("-binary") << QLatin1String("-o") << binaryName << projectFileName) != EXIT_SUCCESS) { - throw Error(QString::fromLatin1("Could not compile rcc project file.")); + throw Error(QString::fromLatin1("Cannot compile rcc project file.")); } return QSharedPointer<QInstaller::Resource>(new QInstaller::Resource(binaryName, binaryName @@ -441,6 +485,10 @@ static void printUsage() std::cout << " -rcc|--compile-resource Compiles the default resource and outputs the result into" << std::endl; std::cout << " 'update.rcc' in the current path." << std::endl; +#ifdef Q_OS_OSX + std::cout << " -s|--sign identity Sign generated app bundle using the given code " << std::endl; + std::cout << " signing identity" << std::endl; +#endif std::cout << std::endl; std::cout << "Packages are to be found in the current working directory and get listed as " "their names" << std::endl << std::endl; @@ -487,7 +535,7 @@ void copyConfigData(const QString &configFile, const QString &targetDir) const QString tagName = domElement.tagName(); const QString elementText = domElement.text(); - qDebug() << QString::fromLatin1("Read dom element: <%1>%2</%1>.").arg(tagName, elementText); + qDebug().noquote() << QString::fromLatin1("Read dom element: <%1>%2</%1>.").arg(tagName, elementText); QString newName = domElement.text().replace(QRegExp(QLatin1String("\\\\|/|\\.|:")), QLatin1String("_")); @@ -556,6 +604,7 @@ int main(int argc, char **argv) QStringList filteredPackages; QInstallerTools::FilterType ftype = QInstallerTools::Exclude; bool compileResource = false; + QString signingIdentity; const QStringList args = app.arguments().mid(1); for (QStringList::const_iterator it = args.begin(); it != args.end(); ++it) { @@ -643,6 +692,13 @@ int main(int argc, char **argv) continue; } else if (*it == QLatin1String("-rcc") || *it == QLatin1String("--compile-resource")) { compileResource = true; +#ifdef Q_OS_OSX + } else if (*it == QLatin1String("-s") || *it == QLatin1String("--sign")) { + ++it; + if (it == args.end() || it->startsWith(QLatin1String("-"))) + return printErrorAndUsageAndExit(QString::fromLatin1("Error: No code signing identity specified.")); + signingIdentity = *it; +#endif } else { if (it->startsWith(QLatin1String("-"))) { return printErrorAndUsageAndExit(QString::fromLatin1("Error: Unknown option \"%1\" used. Maybe you " @@ -737,7 +793,7 @@ int main(int argc, char **argv) input.installerExePath = templateBinary; qDebug() << "Creating the binary"; - exitCode = assemble(input, settings); + exitCode = assemble(input, settings, signingIdentity); } else { createDefaultResourceFile(tmpMetaDir, QDir::currentPath() + QLatin1String("/update.rcc")); exitCode = EXIT_SUCCESS; |