From b187ac12323409fcae4ccc36c5d0fb3cd12a1ffc Mon Sep 17 00:00:00 2001 From: Jakub Jirutka Date: Sat, 18 Jul 2015 21:53:24 +0200 Subject: [PATCH] Add task for creating DMG installation image (cherry picked from commit 83948303f4f71a5ccfe48efa6bea73f936134da2) --- src/Makefile | 22 +- src/create-dmg/LICENSE | 21 ++ src/create-dmg/README | 2 + src/create-dmg/background.png | Bin 0 -> 24421 bytes src/create-dmg/builder/create-dmg.builder | 26 +++ src/create-dmg/create-dmg | 230 ++++++++++++++++++++ src/create-dmg/support/dmg-license.py | 163 ++++++++++++++ src/create-dmg/support/template.applescript | 79 +++++++ 8 files changed, 542 insertions(+), 1 deletion(-) create mode 100644 src/create-dmg/LICENSE create mode 100644 src/create-dmg/README create mode 100644 src/create-dmg/background.png create mode 100644 src/create-dmg/builder/create-dmg.builder create mode 100755 src/create-dmg/create-dmg create mode 100755 src/create-dmg/support/dmg-license.py create mode 100644 src/create-dmg/support/template.applescript diff --git a/src/Makefile b/src/Makefile index 9f03fbba8b..9830d6ed7f 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2901,10 +2901,30 @@ $(APPDIR)/Contents: ############################################################################## ### MacVim GUI -.PHONY: macvim macvimclean +.PHONY: macvim macvim-dmg macvimclean + +RELEASEDIR = MacVim/build/Release +DMGDIR = MacVim/build/dmg + macvim: $(VIMTARGET) xcodebuild -project MacVim/MacVim.xcodeproj $(XCODEFLAGS) +macvim-dmg: macvim + mkdir -p $(DMGDIR) + cp MacVim/mvim $(DMGDIR)/ + cp -r $(RELEASEDIR)/MacVim.app $(DMGDIR)/ + rm -rf $(RELEASEDIR)/MacVim-$(VERSION).dmg + create-dmg/create-dmg \ + --volname "MacVim $(VERSION)" \ + --volicon MacVim/icons/MacVim.icns \ + --background create-dmg/background.png \ + --window-size 650 470 \ + --icon-size 80 \ + --icon MacVim.app 240 320 \ + --icon mvim 570 80 \ + --app-drop-link 410 320 \ + $(RELEASEDIR)/MacVim-$(VERSION).dmg $(DMGDIR) + macvimclean: if test -d MacVim; then \ xcodebuild -project MacVim/MacVim.xcodeproj clean; \ diff --git a/src/create-dmg/LICENSE b/src/create-dmg/LICENSE new file mode 100644 index 0000000000..349b6d82b3 --- /dev/null +++ b/src/create-dmg/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2008-2014 Andrey Tarantsov + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/create-dmg/README b/src/create-dmg/README new file mode 100644 index 0000000000..4557795edb --- /dev/null +++ b/src/create-dmg/README @@ -0,0 +1,2 @@ +Content of this directory (except background.png) is copied from +https://github.com/andreyvit/create-dmg (5acf22f). diff --git a/src/create-dmg/background.png b/src/create-dmg/background.png new file mode 100644 index 0000000000000000000000000000000000000000..739494dc9f7f11d73c8a677d8dacd3ed0e4716b2 GIT binary patch literal 24421 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 literal 0 HcmV?d00001 diff --git a/src/create-dmg/builder/create-dmg.builder b/src/create-dmg/builder/create-dmg.builder new file mode 100644 index 0000000000..d4285280f1 --- /dev/null +++ b/src/create-dmg/builder/create-dmg.builder @@ -0,0 +1,26 @@ +SET app_name create-dmg + +VERSION create-dmg.cur create-dmg heads/master + +NEWDIR build.dir temp %-build - + +NEWFILE create-dmg.zip featured %.zip % + + +COPYTO [build.dir] + INTO create-dmg [create-dmg.cur]/create-dmg + INTO sample [create-dmg.cur]/sample + INTO support [create-dmg.cur]/support + +SUBSTVARS [build.dir]/create-dmg [[]] + + +ZIP [create-dmg.zip] + INTO [build-files-prefix] [build.dir] + + +PUT megabox-builds create-dmg.zip +PUT megabox-builds build.log + +PUT s3-builds create-dmg.zip +PUT s3-builds build.log diff --git a/src/create-dmg/create-dmg b/src/create-dmg/create-dmg new file mode 100755 index 0000000000..3e55dd9742 --- /dev/null +++ b/src/create-dmg/create-dmg @@ -0,0 +1,230 @@ +#! /bin/bash + +# Create a read-only disk image of the contents of a folder + +set -e; + +function pure_version() { + echo '1.0.0.2' +} + +function version() { + echo "create-dmg $(pure_version)" +} + +function usage() { + version + echo "Creates a fancy DMG file." + echo "Usage: $(basename $0) options... image.dmg source_folder" + echo "All contents of source_folder will be copied into the disk image." + echo "Options:" + echo " --volname name" + echo " set volume name (displayed in the Finder sidebar and window title)" + echo " --volicon icon.icns" + echo " set volume icon" + echo " --background pic.png" + echo " set folder background image (provide png, gif, jpg)" + echo " --window-pos x y" + echo " set position the folder window" + echo " --window-size width height" + echo " set size of the folder window" + echo " --text-size text_size" + echo " set window text size (10-16)" + echo " --icon-size icon_size" + echo " set window icons size (up to 128)" + echo " --icon file_name x y" + echo " set position of the file's icon" + echo " --hide-extension file_name" + echo " hide the extension of file" + echo " --custom-icon file_name custom_icon_or_sample_file x y" + echo " set position and custom icon" + echo " --app-drop-link x y" + echo " make a drop link to Applications, at location x,y" + echo " --eula eula_file" + echo " attach a license file to the dmg" + echo " --no-internet-enable" + echo " disable automatic mount©" + echo " --version show tool version number" + echo " -h, --help display this help" + exit 0 +} + +WINX=10 +WINY=60 +WINW=500 +WINH=350 +ICON_SIZE=128 +TEXT_SIZE=16 + +while test "${1:0:1}" = "-"; do + case $1 in + --volname) + VOLUME_NAME="$2" + shift; shift;; + --volicon) + VOLUME_ICON_FILE="$2" + shift; shift;; + --background) + BACKGROUND_FILE="$2" + BACKGROUND_FILE_NAME="$(basename $BACKGROUND_FILE)" + BACKGROUND_CLAUSE="set background picture of opts to file \".background:$BACKGROUND_FILE_NAME\"" + REPOSITION_HIDDEN_FILES_CLAUSE="set position of every item to {theBottomRightX + 100, 100}" + shift; shift;; + --icon-size) + ICON_SIZE="$2" + shift; shift;; + --text-size) + TEXT_SIZE="$2" + shift; shift;; + --window-pos) + WINX=$2; WINY=$3 + shift; shift; shift;; + --window-size) + WINW=$2; WINH=$3 + shift; shift; shift;; + --icon) + POSITION_CLAUSE="${POSITION_CLAUSE}set position of item \"$2\" to {$3, $4} +" + shift; shift; shift; shift;; + --hide-extension) + HIDING_CLAUSE="${HIDING_CLAUSE}set the extension hidden of item \"$2\" to true +" + shift; shift;; + --custom-icon) + shift; shift; shift; shift; shift;; + -h | --help) + usage;; + --version) + version; exit 0;; + --pure-version) + pure_version; exit 0;; + --app-drop-link) + APPLICATION_LINK=$2 + APPLICATION_CLAUSE="set position of item \"Applications\" to {$2, $3} +" + shift; shift; shift;; + --eula) + EULA_RSRC=$2 + shift; shift;; + --no-internet-enable) + NOINTERNET=1 + shift;; + -*) + echo "Unknown option $1. Run with --help for help." + exit 1;; + esac +done + +test -z "$2" && { + echo "Not enough arguments. Invoke with --help for help." + exit 1 +} + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +DMG_PATH="$1" +DMG_DIRNAME="$(dirname "$DMG_PATH")" +DMG_DIR="$(cd "$DMG_DIRNAME" > /dev/null; pwd)" +DMG_NAME="$(basename "$DMG_PATH")" +DMG_TEMP_NAME="$DMG_DIR/rw.${DMG_NAME}" +SRC_FOLDER="$(cd "$2" > /dev/null; pwd)" +test -z "$VOLUME_NAME" && VOLUME_NAME="$(basename "$DMG_PATH" .dmg)" + +AUX_PATH="$SCRIPT_DIR/support" + +test -d "$AUX_PATH" || { + echo "Cannot find support directory: $AUX_PATH" + exit 1 +} + +if [ -f "$SRC_FOLDER/.DS_Store" ]; then + echo "Deleting any .DS_Store in source folder" + rm "$SRC_FOLDER/.DS_Store" +fi + +# Create the image +echo "Creating disk image..." +test -f "${DMG_TEMP_NAME}" && rm -f "${DMG_TEMP_NAME}" +ACTUAL_SIZE=`du -sm "$SRC_FOLDER" | sed -e 's/ .*//g'` +DISK_IMAGE_SIZE=$(expr $ACTUAL_SIZE + 20) +hdiutil create -srcfolder "$SRC_FOLDER" -volname "${VOLUME_NAME}" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${DISK_IMAGE_SIZE}m "${DMG_TEMP_NAME}" + +# mount it +echo "Mounting disk image..." +MOUNT_DIR="/Volumes/${VOLUME_NAME}" + +# try unmount dmg if it was mounted previously (e.g. developer mounted dmg, installed app and forgot to unmount it) +echo "Unmounting disk image..." +DEV_NAME=$(hdiutil info | egrep '^/dev/' | sed 1q | awk '{print $1}') +test -d "${MOUNT_DIR}" && hdiutil detach "${DEV_NAME}" + +echo "Mount directory: $MOUNT_DIR" +DEV_NAME=$(hdiutil attach -readwrite -noverify -noautoopen "${DMG_TEMP_NAME}" | egrep '^/dev/' | sed 1q | awk '{print $1}') +echo "Device name: $DEV_NAME" + +if ! test -z "$BACKGROUND_FILE"; then + echo "Copying background file..." + test -d "$MOUNT_DIR/.background" || mkdir "$MOUNT_DIR/.background" + cp "$BACKGROUND_FILE" "$MOUNT_DIR/.background/$BACKGROUND_FILE_NAME" +fi + +if ! test -z "$APPLICATION_LINK"; then + echo "making link to Applications dir" + echo $MOUNT_DIR + ln -s /Applications "$MOUNT_DIR/Applications" +fi + +if ! test -z "$VOLUME_ICON_FILE"; then + echo "Copying volume icon file '$VOLUME_ICON_FILE'..." + cp "$VOLUME_ICON_FILE" "$MOUNT_DIR/.VolumeIcon.icns" + SetFile -c icnC "$MOUNT_DIR/.VolumeIcon.icns" +fi + +# run applescript +APPLESCRIPT=$(mktemp -t createdmg) +cat "$AUX_PATH/template.applescript" | sed -e "s/WINX/$WINX/g" -e "s/WINY/$WINY/g" -e "s/WINW/$WINW/g" -e "s/WINH/$WINH/g" -e "s/BACKGROUND_CLAUSE/$BACKGROUND_CLAUSE/g" -e "s/REPOSITION_HIDDEN_FILES_CLAUSE/$REPOSITION_HIDDEN_FILES_CLAUSE/g" -e "s/ICON_SIZE/$ICON_SIZE/g" -e "s/TEXT_SIZE/$TEXT_SIZE/g" | perl -pe "s/POSITION_CLAUSE/$POSITION_CLAUSE/g" | perl -pe "s/APPLICATION_CLAUSE/$APPLICATION_CLAUSE/g" | perl -pe "s/HIDING_CLAUSE/$HIDING_CLAUSE/" >"$APPLESCRIPT" + +echo "Running Applescript: /usr/bin/osascript \"${APPLESCRIPT}\" \"${VOLUME_NAME}\"" +"/usr/bin/osascript" "${APPLESCRIPT}" "${VOLUME_NAME}" || true +echo "Done running the applescript..." +sleep 4 + +rm "$APPLESCRIPT" + +# make sure it's not world writeable +echo "Fixing permissions..." +chmod -Rf go-w "${MOUNT_DIR}" &> /dev/null || true +echo "Done fixing permissions." + +# make the top window open itself on mount: +echo "Blessing started" +bless --folder "${MOUNT_DIR}" --openfolder "${MOUNT_DIR}" +echo "Blessing finished" + +if ! test -z "$VOLUME_ICON_FILE"; then + # tell the volume that it has a special file attribute + SetFile -a C "$MOUNT_DIR" +fi + +# unmount +echo "Unmounting disk image..." +hdiutil detach "${DEV_NAME}" + +# compress image +echo "Compressing disk image..." +hdiutil convert "${DMG_TEMP_NAME}" -format UDZO -imagekey zlib-level=9 -o "${DMG_DIR}/${DMG_NAME}" +rm -f "${DMG_TEMP_NAME}" + +# adding EULA resources +if [ ! -z "${EULA_RSRC}" -a "${EULA_RSRC}" != "-null-" ]; then + echo "adding EULA resources" + "${AUX_PATH}/dmg-license.py" "${DMG_DIR}/${DMG_NAME}" "${EULA_RSRC}" +fi + +if [ ! -z "${NOINTERNET}" -a "${NOINTERNET}" == 1 ]; then + echo "not setting 'internet-enable' on the dmg" +else + hdiutil internet-enable -yes "${DMG_DIR}/${DMG_NAME}" +fi + +echo "Disk image done" +exit 0 diff --git a/src/create-dmg/support/dmg-license.py b/src/create-dmg/support/dmg-license.py new file mode 100755 index 0000000000..9003a7c5e7 --- /dev/null +++ b/src/create-dmg/support/dmg-license.py @@ -0,0 +1,163 @@ +#! /usr/bin/env python +""" +This script adds a license file to a DMG. Requires Xcode and a plain ascii text +license file. +Obviously only runs on a Mac. + +Copyright (C) 2011-2013 Jared Hobbs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" +import os +import sys +import tempfile +import optparse + + +class Path(str): + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + os.unlink(self) + + +def mktemp(dir=None, suffix=''): + (fd, filename) = tempfile.mkstemp(dir=dir, suffix=suffix) + os.close(fd) + return Path(filename) + + +def main(options, args): + dmgFile, license = args + with mktemp('.') as tmpFile: + with open(tmpFile, 'w') as f: + f.write("""data 'TMPL' (128, "LPic") { + $"1344 6566 6175 6C74 204C 616E 6775 6167" + $"6520 4944 4457 5244 0543 6F75 6E74 4F43" + $"4E54 042A 2A2A 2A4C 5354 430B 7379 7320" + $"6C61 6E67 2049 4444 5752 441E 6C6F 6361" + $"6C20 7265 7320 4944 2028 6F66 6673 6574" + $"2066 726F 6D20 3530 3030 4457 5244 1032" + $"2D62 7974 6520 6C61 6E67 7561 6765 3F44" + $"5752 4404 2A2A 2A2A 4C53 5445" +}; + +data 'LPic' (5000) { + $"0000 0002 0000 0000 0000 0000 0004 0000" +}; + +data 'STR#' (5000, "English buttons") { + $"0006 0D45 6E67 6C69 7368 2074 6573 7431" + $"0541 6772 6565 0844 6973 6167 7265 6505" + $"5072 696E 7407 5361 7665 2E2E 2E7A 4966" + $"2079 6F75 2061 6772 6565 2077 6974 6820" + $"7468 6520 7465 726D 7320 6F66 2074 6869" + $"7320 6C69 6365 6E73 652C 2063 6C69 636B" + $"2022 4167 7265 6522 2074 6F20 6163 6365" + $"7373 2074 6865 2073 6F66 7477 6172 652E" + $"2020 4966 2079 6F75 2064 6F20 6E6F 7420" + $"6167 7265 652C 2070 7265 7373 2022 4469" + $"7361 6772 6565 2E22" +}; + +data 'STR#' (5002, "English") { + $"0006 0745 6E67 6C69 7368 0541 6772 6565" + $"0844 6973 6167 7265 6505 5072 696E 7407" + $"5361 7665 2E2E 2E7B 4966 2079 6F75 2061" + $"6772 6565 2077 6974 6820 7468 6520 7465" + $"726D 7320 6F66 2074 6869 7320 6C69 6365" + $"6E73 652C 2070 7265 7373 2022 4167 7265" + $"6522 2074 6F20 696E 7374 616C 6C20 7468" + $"6520 736F 6674 7761 7265 2E20 2049 6620" + $"796F 7520 646F 206E 6F74 2061 6772 6565" + $"2C20 7072 6573 7320 2244 6973 6167 7265" + $"6522 2E" +};\n\n""") + with open(license, 'r') as l: + kind = 'RTF ' if license.lower().endswith('.rtf') else 'TEXT' + f.write('data \'%s\' (5000, "English") {\n' % kind) + def escape(s): + return s.strip().replace('\\', '\\\\').replace('"', '\\"') + + for line in l: + if len(line) < 1000: + f.write(' "' + escape(line) + '\\n"\n') + else: + for liner in line.split('.'): + f.write(' "' + escape(liner) + '. \\n"\n') + f.write('};\n\n') + f.write("""data 'styl' (5000, "English") { + $"0003 0000 0000 000C 0009 0014 0000 0000" + $"0000 0000 0000 0000 0027 000C 0009 0014" + $"0100 0000 0000 0000 0000 0000 002A 000C" + $"0009 0014 0000 0000 0000 0000 0000" +};\n""") + os.system('hdiutil unflatten -quiet "%s"' % dmgFile) + ret = os.system('%s -a %s -o "%s"' % + (options.rez, tmpFile, dmgFile)) + os.system('hdiutil flatten -quiet "%s"' % dmgFile) + if options.compression is not None: + os.system('cp %s %s.temp.dmg' % (dmgFile, dmgFile)) + os.remove(dmgFile) + if options.compression == "bz2": + os.system('hdiutil convert %s.temp.dmg -format UDBZ -o %s' % + (dmgFile, dmgFile)) + elif options.compression == "gz": + os.system('hdiutil convert %s.temp.dmg -format ' % dmgFile + + 'UDZO -imagekey zlib-devel=9 -o %s' % dmgFile) + os.remove('%s.temp.dmg' % dmgFile) + if ret == 0: + print "Successfully added license to '%s'" % dmgFile + else: + print "Failed to add license to '%s'" % dmgFile + +if __name__ == '__main__': + parser = optparse.OptionParser() + parser.set_usage("""%prog [OPTIONS] + This program adds a software license agreement to a DMG file. + It requires Xcode and either a plain ascii text + or a with the RTF contents. + + See --help for more details.""") + parser.add_option( + '--rez', + '-r', + action='store', + default='/Applications/Xcode.app/Contents/Developer/Tools/Rez', + help='The path to the Rez tool. Defaults to %default' + ) + parser.add_option( + '--compression', + '-c', + action='store', + choices=['bz2', 'gz'], + default=None, + help='Optionally compress dmg using specified compression type. ' + 'Choices are bz2 and gz.' + ) + options, args = parser.parse_args() + cond = len(args) != 2 + if not os.path.exists(options.rez): + print 'Failed to find Rez at "%s"!\n' % options.rez + cond = True + if cond: + parser.print_usage() + sys.exit(1) + main(options, args) diff --git a/src/create-dmg/support/template.applescript b/src/create-dmg/support/template.applescript new file mode 100644 index 0000000000..2a7f2aa0b6 --- /dev/null +++ b/src/create-dmg/support/template.applescript @@ -0,0 +1,79 @@ +on run (volumeName) + tell application "Finder" + tell disk (volumeName as string) + open + + set theXOrigin to WINX + set theYOrigin to WINY + set theWidth to WINW + set theHeight to WINH + + set theBottomRightX to (theXOrigin + theWidth) + set theBottomRightY to (theYOrigin + theHeight) + set dsStore to "\"" & "/Volumes/" & volumeName & "/" & ".DS_STORE\"" + + tell container window + set current view to icon view + set toolbar visible to false + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + set statusbar visible to false + REPOSITION_HIDDEN_FILES_CLAUSE + end tell + + set opts to the icon view options of container window + tell opts + set icon size to ICON_SIZE + set text size to TEXT_SIZE + set arrangement to not arranged + end tell + BACKGROUND_CLAUSE + + -- Positioning + POSITION_CLAUSE + + -- Hiding + HIDING_CLAUSE + + -- Application Link Clause + APPLICATION_CLAUSE + close + open + + update without registering applications + -- Force saving of the size + delay 1 + + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX - 10, theBottomRightY - 10} + end tell + + update without registering applications + end tell + + delay 1 + + tell disk (volumeName as string) + tell container window + set statusbar visible to false + set the bounds to {theXOrigin, theYOrigin, theBottomRightX, theBottomRightY} + end tell + + update without registering applications + end tell + + --give the finder some time to write the .DS_Store file + delay 3 + + set waitTime to 0 + set ejectMe to false + repeat while ejectMe is false + delay 1 + set waitTime to waitTime + 1 + + if (do shell script "[ -f " & dsStore & " ]; echo $?") = "0" then set ejectMe to true + end repeat + log "waited " & waitTime & " seconds for .DS_STORE to be created." + end tell +end run