summaryrefslogtreecommitdiffstats
path: root/tools
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
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')
-rw-r--r--tools/binarycreator/binarycreator.cpp27
-rw-r--r--tools/binarycreator/binarycreator.qrc1
-rw-r--r--tools/binarycreator/resources/mkdmg.sh71
3 files changed, 20 insertions, 79 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)
diff --git a/tools/binarycreator/binarycreator.qrc b/tools/binarycreator/binarycreator.qrc
index a32a88e27..b64e3a21a 100644
--- a/tools/binarycreator/binarycreator.qrc
+++ b/tools/binarycreator/binarycreator.qrc
@@ -2,7 +2,6 @@
<qresource>
<file>resources/default_icon_mac.icns</file>
<file>resources/copylibsintobundle.sh</file>
- <file>resources/mkdmg.sh</file>
<file alias="resources/installerbase.ico">../../src/sdk/installerbase.ico</file>
</qresource>
</RCC>
diff --git a/tools/binarycreator/resources/mkdmg.sh b/tools/binarycreator/resources/mkdmg.sh
deleted file mode 100644
index b697aa0d8..000000000
--- a/tools/binarycreator/resources/mkdmg.sh
+++ /dev/null
@@ -1,71 +0,0 @@
-#!/bin/sh
-#############################################################################
-##
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt Installer Framework.
-##
-## $QT_BEGIN_LICENSE:LGPL21$
-## Commercial License Usage
-## Licensees holding valid commercial Qt licenses may use this file in
-## accordance with the commercial license agreement provided with the
-## Software or, alternatively, in accordance with the terms contained in
-## a written agreement between you and The Qt Company. For licensing terms
-## and conditions see http://www.qt.io/terms-conditions. For further
-## information use the contact form at http://www.qt.io/contact-us.
-##
-## GNU Lesser General Public License Usage
-## Alternatively, this file may be used under the terms of the GNU Lesser
-## General Public License version 2.1 or version 3 as published by the Free
-## Software Foundation and appearing in the file LICENSE.LGPLv21 and
-## LICENSE.LGPLv3 included in the packaging of this file. Please review the
-## following information to ensure the GNU Lesser General Public License
-## requirements will be met: https://www.gnu.org/licenses/lgpl.html and
-## http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-##
-## As a special exception, The Qt Company gives you certain additional
-## rights. These rights are described in The Qt Company LGPL Exception
-## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-#
-# Creates a disk image (dmg) on Mac OS X from the command line.
-# usage:
-# mkdmg <volname> <vers> <srcdir>
-#
-# Where <volname> is the name to use for the mounted image, <vers> is the version
-# number of the volume and <srcdir> is where the contents to put on the dmg are.
-#
-# The result will be a file called <volname>-<vers>.dmg
-
-if [ $# != 2 ]; then
- echo "usage: mkdmg.sh volname srcdir"
- exit 0
-fi
-
-VOL="$1"
-FILES="$2"
-PATHNAME=`dirname $FILES`
-
-# keep '.XXXXXX' at the end to satisfy 'mktemp' as shipped on OS X
-DMG=`mktemp "/tmp/$VOL.XXXXXX"`
-
-# create temporary disk image and format, ejecting when done
-SIZE=`du -sk ${FILES} | sed -n 's,^\([0-9]*\).*,\1,p'`
-SIZE=$((${SIZE}/1000+1))
-hdiutil create "${DMG}.dmg" -megabytes ${SIZE} -ov -volname "$VOL" -type UDIF -fs HFS+ >/dev/null
-DISK=`hdid "${DMG}.dmg" | sed -ne 's,^\(.*\) *Apple_H.*,\1,p'`
-MOUNT=`hdid "${DMG}.dmg" | sed -ne 's,^.*Apple_HFS[^/]*\(/.*\)$,\1,p'`
-
-# mount and copy files onto volume
-cp -R "$PATHNAME/`basename $FILES`" "$MOUNT"
-hdiutil eject $DISK >/dev/null
-
-# convert to compressed image, delete temp image
-rm -f "$PATHNAME/${VOL}.dmg"
-hdiutil convert "${DMG}.dmg" -format UDZO -o "$PATHNAME/${VOL}.dmg" >/dev/null
-rm -f "${DMG}.dmg"