summaryrefslogtreecommitdiffstats
path: root/tools/binarycreator/binarycreator.cpp
diff options
context:
space:
mode:
authorFrerich Raabe <raabe@froglogic.com>2016-04-04 17:54:20 +0200
committerKarsten Heimrich <karsten.heimrich@theqtcompany.com>2016-04-08 10:18:57 +0000
commitb5480f253ac64ad66e8f8150d7dd7896fc6258e0 (patch)
tree006771034d0be6a1d47921ece37c2b6aa9180417 /tools/binarycreator/binarycreator.cpp
parent805e91ba4b73e28c30fc5e7a61e99774a3e9ae74 (diff)
Fixed (and greatly simplified) creating .dmg files
The mkdmg.sh script which is used to create .dmg files made some effort to calculate the size of the file system contained in the .dmg file. However, it neglected to consider that a .dmg file is not always (never?) totally empty. A sample session on OS X 10.10.5 shows: $ hdiutil create /tmp/foo.dmg -megabytes 33 -ov -volname foo -type UDIF -fs HFS+ ... <a lot more dots here> created: /tmp/foo.dmg $ hdid /tmp/foo.dmg /dev/disk3 GUID_partition_scheme /dev/disk3s1 Apple_HFS /Volumes/foo $ df /Volumes/foo Filesystem 512-blocks Used Available Capacity iused ifree %iused Mounted on /dev/disk3s1 67504 1584 65920 3% 196 8240 2% /Volumes/foo About 792kB are apparently used for bookkeeping (in ".Trashes" and ".fseventsd") directories. Since mkdmg.sh failed to account for these 792kB, the .dmg file it creates was occasionally too small, causing an error message to be printed by the 'cp' command in the mkdmg.sh script (but that error message was never printed anywhere, at least I never noticed when executing binarycreator - always only when running mkdmg.sh directly). Instead of fixing the allocated size, let's just make use of the '-srcfolder' argument to 'hdiutil create' which does all of this automatically. It requires no copying around or calculating sizes, which not only makes the script much simpler, it also avoids the above-mentioned issue but also makes the script run faster: about 30% faster in my experiments. With this, the mkdmg.sh script is so small (just one hdiutil and one rm call) that we may just as well drop it completely and perform those operations straight from the C++ code. A final nice side-effect is that '-srcfolder' can be specified multiple times: this makes it very easy to copy multiple directory trees in the resulting .dmg file. This in turn is useful to create nicely styled .dmg files with custom background image and icon arrangements. Change-Id: I54d63a00e56d1ee9fa61c2690ca42d512fda37b1 Reviewed-by: Karsten Heimrich <karsten.heimrich@theqtcompany.com>
Diffstat (limited to 'tools/binarycreator/binarycreator.cpp')
-rw-r--r--tools/binarycreator/binarycreator.cpp27
1 files changed, 20 insertions, 7 deletions
diff --git a/tools/binarycreator/binarycreator.cpp b/tools/binarycreator/binarycreator.cpp
index 5abd3bbd7..1a6a10471 100644
--- a/tools/binarycreator/binarycreator.cpp
+++ b/tools/binarycreator/binarycreator.cpp
@@ -342,16 +342,29 @@ static int assemble(Input input, const QInstaller::Settings &settings, const QSt
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.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);
- QFile::remove(mkdmgscript);
- qDebug() << "done." << mkdmgscript;
+ qDebug() << "removing" << bundle;
+ QDir(bundle).removeRecursively();
+ qDebug() << "done.";
}
#else
Q_UNUSED(signingIdentity)