5 # Create a MacOSX Installer *multi* package for SOPE.
11 PKG_BUILD_DIR="$PWD/osxpkgbuild"
12 PKG_DIR="$PKG_BUILD_DIR/${PKG_NAME}.mpkg"
13 PKG_RSRC_DIR="$PKG_BUILD_DIR/${PKG_NAME}.mpkg/Contents/Resources"
15 ROOT_DIR="$PKG_BUILD_DIR/Packages"
18 PLIST_DT_ID="-//Apple Computer//DTD PLIST 1.0//EN"
19 PLIST_DT_LOC="http://www.apple.com/DTDs/PropertyList-1.0.dtd"
20 INSTALLER_FORMAT_KEY="0.10000000149011612"
22 BACKGROUND_TIFF="maintenance/package-background.tiff"
23 LICENSE_FILE="maintenance/License.rtf"
24 WELCOME_FILE="maintenance/Welcome.rtf"
34 # ****************************** usage ********************************
38 make-osxmpkg.sh <pkgname>
43 # ****************************** validate cmdline args ****************
45 function validateArgs() {
46 if test "x$PKG_NAME" = "x"; then
53 # ****************************** prepare/cleanup tmpfiles *************
55 function prepareTmpDirs() {
56 if test -d $PKG_BUILD_DIR; then
57 echo -n " deleting old builddir: $PKG_BUILD_DIR .."
58 ${SUDO} ${RM_R} $PKG_BUILD_DIR
62 echo -n " preparing temporary builddir .."
63 ${MKDIRS} "${PKG_BUILD_DIR}"
64 ${MKDIRS} "${PKG_DIR}"
65 ${MKDIRS} "${PKG_RSRC_DIR}"
66 ${MKDIRS} "${PKG_RSRC_DIR}/English.lproj"
67 ${MKDIRS} "${ROOT_DIR}"
68 echo ".. done: $PKG_BUILD_DIR."
71 function fixUpPermissions() {
72 echo -n " fixing permissions in builddir (requires sudo) .."
73 ${SUDO} ${CHOWN} -R root "${ROOT_DIR}"
74 ${SUDO} ${CHGRP} -R admin "${ROOT_DIR}"
75 ${SUDO} ${CHMOD} -R 755 "${ROOT_DIR}"
76 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}"
77 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}/Library"
81 function cleanupTmpDirs() {
82 if test -d $PKG_BUILD_DIR; then
83 echo -n " deleting builddir: $PKG_BUILD_DIR .."
90 # ****************************** info files ***************************
92 function plistWriteString() {
94 echo " <string>$2</string>"
96 function plistWriteInt() {
98 echo " <integer>`echo $2`</integer>"
100 function plistWriteReal() {
101 echo " <key>$1</key>"
102 echo " <real>`echo $2`</real>"
104 function plistWriteDate() {
105 echo " <key>$1</key>"
106 echo " <date>$2</date>"
108 function plistWriteBool() {
109 echo " <key>$1</key>"
113 function genSubPkgEntry {
115 echo " <key>IFPkgFlagPackageLocation</key>"
116 echo " <string>$1</string>"
117 echo " <key>IFPkgFlagPackageSelection</key>"
118 echo " <string>$2</string>"
122 function genInfoPList() {
123 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
124 # SoftwareDistribution/Concepts/sd_pkg_flags.html
125 F="${PKG_DIR}/Contents/Info.plist"
126 echo -n " gen Info.plist: $F .."
128 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
129 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
130 echo >>$F "<plist version=\"1.0\">"
133 plistWriteString >>$F IFMajorVersion 4
134 plistWriteString >>$F IFMinorVersion 5
136 plistWriteDate >>$F IFPkgBuildDate "`date -u +%Y-%m-%dT%H:%M:%SZ`"
137 plistWriteString >>$F IFPkgBuildVersion "${PKG_VERSION}"
138 #plistWriteBool >>$F IFPkgFlagAllowBackRev true
139 plistWriteString >>$F IFPkgFlagAuthorizationAction AdminAuthorization
140 plistWriteString >>$F IFPkgFlagBackgroundAlignment topright
141 plistWriteString >>$F IFPkgFlagBackgroundScaling none
142 plistWriteString >>$F IFPkgFlagDefaultLocation /
143 #plistWriteBool >>$F IFPkgFlagFollowLinks true
144 #plistWriteBool >>$F IFPkgFlagInstallFat true
145 #plistWriteBool >>$F IFPkgFlagIsRequired false
146 #plistWriteBool >>$F IFPkgFlagOverwritePermissions false
147 plistWriteBool >>$F IFPkgFlagRelocatable true
148 plistWriteString >>$F IFPkgFlagRestartAction NoRestart
149 plistWriteBool >>$F IFPkgFlagRootVolumeOnly false
150 plistWriteBool >>$F IFPkgFlagUpdateInstalledLanguages false
151 #plistWriteBool >>$F IFPkgFlagUseUserMask false
152 plistWriteReal >>$F IFPkgFormatVersion "${INSTALLER_FORMAT_KEY}"
154 plistWriteString >>$F IFPkgFlagComponentDirectory "../Packages"
156 # generate sub-package list
157 echo >>$F " <key>IFPkgFlagPackageList</key>"
159 for i in sope-xml sope-core sope-mime sope-appserver; do
160 genSubPkgEntry >>$F $i.pkg required
162 for i in sope-ical sope-ldap sope-gdl1 sopex; do
163 genSubPkgEntry >>$F $i.pkg selected
165 echo >>$F " </array>"
170 if test "x$CHECK_XML" = "xyes"; then
177 function genVersionPList() {
178 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
179 # SoftwareDistribution/Concepts/sd_pkg_flags.html
180 F="${PKG_DIR}/Contents/version.plist"
181 echo -n " gen version.plist: $F .."
183 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
184 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
185 echo >>$F "<plist version=\"1.0\">"
188 plistWriteString >>$F BuildVersion 4
189 plistWriteString >>$F CFBundleShortVersionString "4.5"
190 plistWriteString >>$F ProjectName "${PKG_NAME}"
191 plistWriteString >>$F SourceVersion 45000
196 if test "x$CHECK_XML" = "xyes"; then
203 function genEnDescription() {
204 F="${PKG_RSRC_DIR}/English.lproj/Description.plist"
205 echo -n " gen description plist: $F .."
207 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
208 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
209 echo >>$F "<plist version=\"1.0\">"
212 plistWriteString >>$F IFPkgDescriptionDescription "${PKG_NAME}"
213 plistWriteString >>$F IFPkgDescriptionTitle "${PKG_NAME}"
214 plistWriteString >>$F IFPkgDescriptionVersion "${PKG_VERSION}"
218 if test "x$CHECK_XML" = "xyes"; then
224 function genInfoFile() {
225 F="${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info"
226 echo -n " gen info file: $F .."
228 echo >$F "Title ${PKG_NAME}"
229 echo >>$F "Version ${PKG_VERSION}"
230 echo >>$F "Description ${PKG_VERSION}"
232 echo >>$F "PackageLocation ../"
233 echo >>$F "FastInstall NO"
235 echo >>$F "Require Reboot NO" # TODO: consolidate
236 echo >>$F "OverwritePermissions NO" # TODO: consolidate
237 echo >>$F "UseUserMask NO" # TODO: consolidate
238 echo >>$F "RootVolumeOnly NO" # TODO: consolidate
239 echo >>$F "NeedsAuthorization YES" # TODO: consolidate
240 echo >>$F "DefaultLocation /" # TODO: consolidate
241 echo >>$F "Relocatable YES" # TODO: consolidate
242 echo >>$F "Install Fat YES" # TODO: consolidate
243 echo >>$F "LibrarySubdirectory Standard"
245 ln -s ${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info \
246 ${PKG_RSRC_DIR}/English.lproj/Install.info
251 function genPkgInfoFile() {
252 F="${PKG_DIR}/Contents/PkgInfo"
253 echo -n " gen PkgInfo: $F .."
258 function genPkgVersionFile() {
259 F="${PKG_RSRC_DIR}/package_version"
260 echo -n " gen package_version: $F .."
266 function genRequiredPkgs() {
267 F="${PKG_RSRC_DIR}/Install.list"
268 echo -n " gen Install.list (requirements): $F .."
269 echo >$F "BSD.pkg:required"
270 echo >>$F "BSDSDK.pkg:required"
271 echo >>$F "DeveloperTools.pkg:required"
276 # ****************************** resources ****************************
278 function copyBackgroundImage() {
279 if test -f "${BACKGROUND_TIFF}"; then
280 cp "${BACKGROUND_TIFF}" "${PKG_RSRC_DIR}/background.tiff"
282 echo "ERROR: did not find background image: ${BACKGROUND_TIFF}"
286 function copyLicenseFile() {
287 if test -f "${LICENSE_FILE}"; then
288 cp "${LICENSE_FILE}" "${PKG_RSRC_DIR}/English.lproj/License.rtf"
290 echo "ERROR: did not find file: ${LICENSE_FILE}"
293 function copyWelcomeFile() {
294 if test -f "${WELCOME_FILE}"; then
295 cp "${WELCOME_FILE}" "${PKG_RSRC_DIR}/English.lproj/Welcome.rtf"
297 echo "ERROR: did not find file: ${WELCOME_FILE}"
302 # ****************************** debugging ****************************
304 function debugShowResults() {
306 echo "prepared contents:"
307 find -s $PKG_BUILD_DIR \
308 | sed "sX${PKG_BUILD_DIR}/X Xg"
312 # ****************************** sudo *********************************
314 function ensureSudo() {
315 # this will bring up the 'sudo' authentication
316 if test "x$USER" != "xroot"; then
317 echo "We need to run some commands using 'sudo', so please enter your "
318 echo "credentials when being asked for them (unless you already did so)"
319 sudo touch /tmp/osx-pkg-sudo-tmp
320 sudo rm /tmp/osx-pkg-sudo-tmp
325 # ****************************** sudo *********************************
327 function copyPackages() {
329 cp -R $i "${ROOT_DIR}"/
334 # ****************************** running ******************************
336 echo "Building SOPE MacOSX Installer.app packages $PKG_NAME.mpkg .."
357 # debugging, print results