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 # ****************************** options ******************************
36 # if we set this to 'yes', we get no 'upgrade' button on "reinstalls"
39 # RootAuthorization / AdminAuthorization
40 PKG_AUTHORIZATION=RootAuthorization
43 # ****************************** usage ********************************
47 make-osxmpkg.sh <pkgname>
52 # ****************************** validate cmdline args ****************
54 function validateArgs() {
55 if test "x$PKG_NAME" = "x"; then
62 # ****************************** prepare/cleanup tmpfiles *************
64 function prepareTmpDirs() {
65 if test -d $PKG_BUILD_DIR; then
66 echo -n " deleting old builddir: $PKG_BUILD_DIR .."
67 ${SUDO} ${RM_R} $PKG_BUILD_DIR
71 echo -n " preparing temporary builddir .."
72 ${MKDIRS} "${PKG_BUILD_DIR}"
73 ${MKDIRS} "${PKG_DIR}"
74 ${MKDIRS} "${PKG_RSRC_DIR}"
75 ${MKDIRS} "${PKG_RSRC_DIR}/English.lproj"
76 ${MKDIRS} "${ROOT_DIR}"
77 echo ".. done: $PKG_BUILD_DIR."
80 function fixUpPermissions() {
81 echo -n " fixing permissions in builddir (requires sudo) .."
82 ${SUDO} ${CHOWN} -R root "${ROOT_DIR}"
83 ${SUDO} ${CHGRP} -R admin "${ROOT_DIR}"
84 ${SUDO} ${CHMOD} -R 755 "${ROOT_DIR}"
85 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}"
86 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}/Library"
90 function cleanupTmpDirs() {
91 if test -d $PKG_BUILD_DIR; then
92 echo -n " deleting builddir: $PKG_BUILD_DIR .."
99 # ****************************** info files ***************************
101 function plistWriteString() {
102 echo " <key>$1</key>"
103 echo " <string>$2</string>"
105 function plistWriteInt() {
106 echo " <key>$1</key>"
107 echo " <integer>`echo $2`</integer>"
109 function plistWriteReal() {
110 echo " <key>$1</key>"
111 echo " <real>`echo $2`</real>"
113 function plistWriteDate() {
114 echo " <key>$1</key>"
115 echo " <date>$2</date>"
117 function plistWriteBool() {
118 echo " <key>$1</key>"
122 function genSubPkgEntry {
124 echo " <key>IFPkgFlagPackageLocation</key>"
125 echo " <string>$1</string>"
126 echo " <key>IFPkgFlagPackageSelection</key>"
127 echo " <string>$2</string>"
131 function genInfoPList() {
132 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
133 # SoftwareDistribution/Concepts/sd_pkg_flags.html
134 F="${PKG_DIR}/Contents/Info.plist"
135 echo -n " gen Info.plist: $F .."
137 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
138 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
139 echo >>$F "<plist version=\"1.0\">"
142 plistWriteString >>$F IFMajorVersion 4
143 plistWriteString >>$F IFMinorVersion 5
145 plistWriteDate >>$F IFPkgBuildDate "`date -u +%Y-%m-%dT%H:%M:%SZ`"
146 plistWriteString >>$F IFPkgBuildVersion "${PKG_VERSION}"
147 #plistWriteBool >>$F IFPkgFlagAllowBackRev true
149 # allowed: AdminAuthorization, RootAuthorization, ??
150 plistWriteString >>$F IFPkgFlagAuthorizationAction ${PKG_AUTHORIZATION}
152 plistWriteString >>$F IFPkgFlagBackgroundAlignment topright
153 plistWriteString >>$F IFPkgFlagBackgroundScaling none
154 plistWriteString >>$F IFPkgFlagDefaultLocation /
155 #plistWriteBool >>$F IFPkgFlagFollowLinks true
157 #plistWriteBool >>$F IFPkgFlagInstallFat true
159 #plistWriteBool >>$F IFPkgFlagIsRequired false
160 #plistWriteBool >>$F IFPkgFlagOverwritePermissions false
162 if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
163 plistWriteBool >>$F IFPkgFlagRelocatable true
165 plistWriteBool >>$F IFPkgFlagRelocatable false
168 plistWriteString >>$F IFPkgFlagRestartAction NoRestart
169 plistWriteBool >>$F IFPkgFlagRootVolumeOnly false
170 plistWriteBool >>$F IFPkgFlagUpdateInstalledLanguages false
171 #plistWriteBool >>$F IFPkgFlagUseUserMask false
172 plistWriteReal >>$F IFPkgFormatVersion "${INSTALLER_FORMAT_KEY}"
174 plistWriteString >>$F IFPkgFlagComponentDirectory "../Packages"
176 # generate sub-package list
177 echo >>$F " <key>IFPkgFlagPackageList</key>"
179 for i in sope-xml sope-core sope-mime sope-appserver; do
180 genSubPkgEntry >>$F $i.pkg required
182 for i in sope-ical sope-ldap sope-gdl1 sopex; do
183 genSubPkgEntry >>$F $i.pkg selected
185 echo >>$F " </array>"
190 if test "x$CHECK_XML" = "xyes"; then
197 function genVersionPList() {
198 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
199 # SoftwareDistribution/Concepts/sd_pkg_flags.html
200 F="${PKG_DIR}/Contents/version.plist"
201 echo -n " gen version.plist: $F .."
203 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
204 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
205 echo >>$F "<plist version=\"1.0\">"
208 plistWriteString >>$F BuildVersion 4
209 plistWriteString >>$F CFBundleShortVersionString "4.5"
210 plistWriteString >>$F ProjectName "${PKG_NAME}"
211 plistWriteString >>$F SourceVersion 45000
216 if test "x$CHECK_XML" = "xyes"; then
223 function genEnDescription() {
224 F="${PKG_RSRC_DIR}/English.lproj/Description.plist"
225 echo -n " gen description plist: $F .."
227 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
228 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
229 echo >>$F "<plist version=\"1.0\">"
232 plistWriteString >>$F IFPkgDescriptionDescription "${PKG_NAME}"
233 plistWriteString >>$F IFPkgDescriptionTitle "${PKG_NAME}"
234 plistWriteString >>$F IFPkgDescriptionVersion "${PKG_VERSION}"
238 if test "x$CHECK_XML" = "xyes"; then
244 function genInfoFile() {
245 F="${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info"
246 echo -n " gen info file: $F .."
248 echo >$F "Title ${PKG_NAME}"
249 echo >>$F "Version ${PKG_VERSION}"
250 echo >>$F "Description ${PKG_VERSION}"
252 # TODO: find documentation for this one
253 # echo >>$F "PackageLocation ../Packages"
254 echo >>$F "FastInstall NO"
256 echo >>$F "Require Reboot NO" # TODO: consolidate
257 echo >>$F "OverwritePermissions NO" # TODO: consolidate
258 echo >>$F "UseUserMask NO" # TODO: consolidate
259 echo >>$F "RootVolumeOnly NO" # TODO: consolidate
261 if test "x${PKG_AUTHORIZATION}" = "x"; then
262 echo >>$F "NeedsAuthorization NO"
264 # need to check Admin/Root?
265 echo >>$F "NeedsAuthorization YES"
268 echo >>$F "DefaultLocation /" # TODO: consolidate
270 if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
271 echo >>$F "Relocatable YES"
273 echo >>$F "Relocatable NO"
276 #echo >>$F "Install Fat YES" # TODO: consolidate
277 echo >>$F "LibrarySubdirectory Standard"
280 cd "${PKG_RSRC_DIR}/English.lproj/"
281 ln -s "${PKG_NAME}.info" Install.info
287 function genPkgInfoFile() {
288 F="${PKG_DIR}/Contents/PkgInfo"
289 echo -n " gen PkgInfo: $F .."
294 function genPkgVersionFile() {
295 F="${PKG_RSRC_DIR}/package_version"
296 echo -n " gen package_version: $F .."
302 function genRequiredPkgs() {
303 F="${PKG_RSRC_DIR}/Install.list"
304 echo -n " gen Install.list (requirements): $F .."
305 echo >$F "BSD.pkg:required"
306 echo >>$F "BSDSDK.pkg:required"
307 echo >>$F "DeveloperTools.pkg:required"
312 # ****************************** resources ****************************
314 function copyBackgroundImage() {
315 if test -f "${BACKGROUND_TIFF}"; then
316 cp "${BACKGROUND_TIFF}" "${PKG_RSRC_DIR}/background.tiff"
318 echo "ERROR: did not find background image: ${BACKGROUND_TIFF}"
322 function copyLicenseFile() {
323 if test -f "${LICENSE_FILE}"; then
324 cp "${LICENSE_FILE}" "${PKG_RSRC_DIR}/English.lproj/License.rtf"
326 echo "ERROR: did not find file: ${LICENSE_FILE}"
329 function copyWelcomeFile() {
330 if test -f "${WELCOME_FILE}"; then
331 cp "${WELCOME_FILE}" "${PKG_RSRC_DIR}/English.lproj/Welcome.rtf"
333 echo "ERROR: did not find file: ${WELCOME_FILE}"
338 # ****************************** debugging ****************************
340 function debugShowResults() {
342 echo "prepared contents:"
343 find -s $PKG_BUILD_DIR \
344 | sed "sX${PKG_BUILD_DIR}/X Xg"
348 # ****************************** sudo *********************************
350 function ensureSudo() {
351 # this will bring up the 'sudo' authentication
352 if test "x$USER" != "xroot"; then
353 echo "We need to run some commands using 'sudo', so please enter your "
354 echo "credentials when being asked for them (unless you already did so)"
355 sudo touch /tmp/osx-pkg-sudo-tmp
356 sudo rm /tmp/osx-pkg-sudo-tmp
361 # ****************************** sudo *********************************
363 function copyPackages() {
365 cp -R $i "${ROOT_DIR}"/
370 # ****************************** running ******************************
372 echo "Building SOPE MacOSX Installer.app multipackage $PKG_NAME.mpkg .."
393 # debugging, print results