1: #!/bin/bash
2: set -x
3: LANG=C # Otherwise du gives french comma and can't sum!
4: # borrowed to Andy Maloney
5: # http://asmaloney.com/2013/07/howto/packaging-a-mac-os-x-application-using-a-dmg/
6:
7: # make sure we are in the correct dir when we double-click a .command file
8: dir=${0%/*}
9: if [ -d "$dir" ]; then
10: cd "$dir"
11: fi
12:
13: # set up your app name, version number, and background image file name
14: #APP_NAME="imach"
15: APP_NAME=$4
16: VERSION=$5
17: #"0.98nT"
18: DMG_BACKGROUND_IMG="Background.png"
19:
20: # you should not need to change these
21: #APP_EXE="/Users/nbrouard/Documents/imachcvs/NetBeans/imach/src
22: #APP_EXE="${APP_NAME}.app/Contents/MacOS/${APP_NAME}"
23: APP_EXE="${APP_NAME}.app/Contents/MacOS/applet"
24:
25: #VOL_NAME="${APP_NAME} ${VERSION}" # volume name will be "SuperCoolApp 1.0.0"
26: VOL_NAME=$2 # volume name will be "SuperCoolApp 1.0.0"
27: #DMG_FINAL="${VOL_NAME}.dmg" # final DMG name will be "SuperCoolApp 1.0.0.dmg"
28: DMG_FINAL=$3 # final DMG name will be "SuperCoolApp 1.0.0.dmg"
29: DMG_TMP="${VOL_NAME}-temp.dmg"
30: STAGING_DIR="./Install" # we copy all our stuff into this dir
31:
32: # Check the background image DPI and convert it if it isn't 72x72
33: _BACKGROUND_IMAGE_DPI_H=`sips -g dpiHeight ${DMG_BACKGROUND_IMG} | grep -Eo '[0-9]+\.[0-9]+'`
34: _BACKGROUND_IMAGE_DPI_W=`sips -g dpiWidth ${DMG_BACKGROUND_IMG} | grep -Eo '[0-9]+\.[0-9]+'`
35:
36: if [ $(echo " $_BACKGROUND_IMAGE_DPI_H != 72.0 " | bc) -eq 1 -o $(echo " $_BACKGROUND_IMAGE_DPI_W != 72.0 " | bc) -eq 1 ]; then
37: echo "WARNING: The background image's DPI is not 72. This will result in distorted backgrounds on Mac OS X 10.7+."
38: echo " I will convert it to 72 DPI for you."
39:
40: _DMG_BACKGROUND_TMP="${DMG_BACKGROUND_IMG%.*}"_dpifix."${DMG_BACKGROUND_IMG##*.}"
41:
42: sips -s dpiWidth 72 -s dpiHeight 72 ${DMG_BACKGROUND_IMG} --out ${_DMG_BACKGROUND_TMP}
43:
44: DMG_BACKGROUND_IMG="${_DMG_BACKGROUND_TMP}"
45: fi
46:
47: # clear out any old data
48: rm -rf "${STAGING_DIR}" "${DMG_TMP}" "${DMG_FINAL}"
49:
50: # copy over the stuff we want in the final disk image to our staging dir
51: mkdir -p "${STAGING_DIR}"
52: cp -rpf "${APP_NAME}.app" "${STAGING_DIR}"
53: # ... cp anything else you want in the DMG - documentation, etc.
54:
55: pushd "${STAGING_DIR}"
56:
57: # strip the executable
58: echo "Stripping ${APP_EXE}..."
59: strip -u -r "${APP_EXE}"
60:
61: # compress the executable if we have upx in PATH
62: # UPX: http://upx.sourceforge.net/
63: if hash upx 2>/dev/null; then
64: echo "Compressing (UPX) ${APP_EXE}..."
65: upx -9 "${APP_EXE}"
66: fi
67:
68: # ... perform any other stripping/compressing of libs and executables
69:
70: popd
71:
72: # figure out how big our DMG needs to be
73: # assumes our contents are at least 1M!
74: SIZE=`du -sh "${STAGING_DIR}" | sed 's/\([0-9\.]*\)M\(.*\)/\1/'`
75: #SIZE=`du -sm "${STAGING_DIR}" | sed 's/\([0-9\.]*\)m\(.*\)/\1/'`
76: SIZE=`echo "${SIZE} + 1.0" | bc | awk '{print int($1+0.5)}'`
77: #SIZE=1
78:
79: if [ $? -ne 0 ]; then
80: echo "Error: Cannot compute size of staging dir"
81: exit
82: fi
83:
84: # create the temp DMG file
85: hdiutil create -srcfolder "${STAGING_DIR}" -volname "${VOL_NAME}" -fs HFS+ \
86: -format UDRW -size ${SIZE}M "${DMG_TMP}"
87: # -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${SIZE}M "${DMG_TMP}"
88:
89: echo "Created DMG: ${DMG_TMP}"
90:
91: # mount it and save the device
92: # works and I verified that it keeps the hml subdirectory.
93: DEVICE=$(hdiutil attach -readwrite -noverify "${DMG_TMP}" | \
94: egrep '^/dev/' | sed 1q | awk '{print $1}')
95:
96: sleep 2
97:
98: # add a link to the Applications dir
99: echo "Add link to /Applications"
100: pushd /Volumes/"${VOL_NAME}"
101: ln -s /Applications
102: popd
103:
104: # add a background image
105: mkdir /Volumes/"${VOL_NAME}"/.background
106: cp "${DMG_BACKGROUND_IMG}" /Volumes/"${VOL_NAME}"/.background/
107:
108: # tell the Finder to resize the window, set the background,
109: # change the icon size, place the icons in the right position, etc.
110: echo '
111: tell application "Finder"
112: tell disk "'${VOL_NAME}'"
113: open
114: set current view of container window to icon view
115: set toolbar visible of container window to false
116: set statusbar visible of container window to false
117: set the bounds of container window to {400, 100, 920, 440}
118: set viewOptions to the icon view options of container window
119: set arrangement of viewOptions to not arranged
120: set icon size of viewOptions to 72
121: set background picture of viewOptions to file ".background:'${DMG_BACKGROUND_IMG}'"
122: set position of item "'${APP_NAME}'.app" of container window to {160, 205}
123: set position of item "Applications" of container window to {360, 205}
124: close
125: open
126: update without registering applications
127: delay 2
128: end tell
129: end tell
130: ' | osascript
131:
132: sync
133:
134: # unmount it
135: hdiutil detach "${DEVICE}"
136:
137: # now make the final image a compressed disk image
138: echo "Creating compressed image"
139: hdiutil convert "${DMG_TMP}" -format UDZO -imagekey zlib-level=9 -o "${DMG_FINAL}"
140:
141: # clean up
142: pwd
143: sleep 2
144: rm -rf "${DMG_TMP}"
145: rm -rf "${STAGING_DIR}"
146:
147: echo 'Done.'
148:
149: exit
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>