summaryrefslogtreecommitdiffstats
path: root/tools/binarycreator/binarycreator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/binarycreator/binarycreator.cpp')
-rw-r--r--tools/binarycreator/binarycreator.cpp100
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;