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 # TODO: make that arguments
18 PKG_SUBMINOR_VERSION=trunk
20 PKG_VERSION="${PKG_MAJOR_VERSION}.${PKG_MINOR_VERSION}.${PKG_SUBMINOR_VERSION}"
21 ROOT_DIR="$PKG_BUILD_DIR/Packages"
24 PLIST_DT_ID="-//Apple Computer//DTD PLIST 1.0//EN"
25 PLIST_DT_LOC="http://www.apple.com/DTDs/PropertyList-1.0.dtd"
26 INSTALLER_FORMAT_KEY="0.10000000149011612"
28 BACKGROUND_TIFF="maintenance/package-background.tiff"
29 LICENSE_FILE="maintenance/License.rtf"
30 WELCOME_FILE="maintenance/Welcome.rtf"
40 # ****************************** options ******************************
42 # if we set this to 'yes', we get no 'upgrade' button on "reinstalls"
45 # RootAuthorization / AdminAuthorization
46 PKG_AUTHORIZATION=RootAuthorization
49 # ****************************** usage ********************************
53 make-osxmpkg.sh <pkgname>
58 # ****************************** validate cmdline args ****************
60 function validateArgs() {
61 if test "x$PKG_NAME" = "x"; then
68 # ****************************** prepare/cleanup tmpfiles *************
70 function prepareTmpDirs() {
71 if test -d $PKG_BUILD_DIR; then
72 echo -n " deleting old builddir: $PKG_BUILD_DIR .."
73 ${SUDO} ${RM_R} $PKG_BUILD_DIR
77 echo -n " preparing temporary builddir .."
78 ${MKDIRS} "${PKG_BUILD_DIR}"
79 ${MKDIRS} "${PKG_DIR}"
80 ${MKDIRS} "${PKG_RSRC_DIR}"
81 ${MKDIRS} "${PKG_RSRC_DIR}/English.lproj"
82 ${MKDIRS} "${ROOT_DIR}"
83 echo ".. done: $PKG_BUILD_DIR."
86 function fixUpPermissions() {
87 echo -n " fixing permissions in builddir (requires sudo) .."
88 ${SUDO} ${CHOWN} -R root "${ROOT_DIR}"
89 ${SUDO} ${CHGRP} -R admin "${ROOT_DIR}"
90 ${SUDO} ${CHMOD} -R 755 "${ROOT_DIR}"
91 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}"
92 ${SUDO} ${CHMOD} u+t "${ROOT_DIR}/Library"
96 function cleanupTmpDirs() {
97 if test -d $PKG_BUILD_DIR; then
98 echo -n " deleting builddir: $PKG_BUILD_DIR .."
105 # ****************************** info files ***************************
107 function plistWriteString() {
108 echo " <key>$1</key>"
109 echo " <string>$2</string>"
111 function plistWriteInt() {
112 echo " <key>$1</key>"
113 echo " <integer>`echo $2`</integer>"
115 function plistWriteReal() {
116 echo " <key>$1</key>"
117 echo " <real>`echo $2`</real>"
119 function plistWriteDate() {
120 echo " <key>$1</key>"
121 echo " <date>$2</date>"
123 function plistWriteBool() {
124 echo " <key>$1</key>"
128 function genSubPkgEntry {
130 echo " <key>IFPkgFlagPackageLocation</key>"
131 echo " <string>$1</string>"
132 echo " <key>IFPkgFlagPackageSelection</key>"
133 echo " <string>$2</string>"
137 function genInfoPList() {
138 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
139 # SoftwareDistribution/Concepts/sd_pkg_flags.html
140 F="${PKG_DIR}/Contents/Info.plist"
141 echo -n " gen Info.plist: $F .."
143 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
144 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
145 echo >>$F "<plist version=\"1.0\">"
148 plistWriteString >>$F IFMajorVersion ${PKG_MAJOR_VERSION}
149 plistWriteString >>$F IFMinorVersion ${PKG_MINOR_VERSION}
151 plistWriteDate >>$F IFPkgBuildDate "`date -u +%Y-%m-%dT%H:%M:%SZ`"
152 plistWriteString >>$F IFPkgBuildVersion "${PKG_VERSION}"
153 #plistWriteBool >>$F IFPkgFlagAllowBackRev true
155 # allowed: AdminAuthorization, RootAuthorization, ??
156 plistWriteString >>$F IFPkgFlagAuthorizationAction ${PKG_AUTHORIZATION}
158 plistWriteString >>$F IFPkgFlagBackgroundAlignment topright
159 plistWriteString >>$F IFPkgFlagBackgroundScaling none
160 plistWriteString >>$F IFPkgFlagDefaultLocation /
161 #plistWriteBool >>$F IFPkgFlagFollowLinks true
163 #plistWriteBool >>$F IFPkgFlagInstallFat true
165 #plistWriteBool >>$F IFPkgFlagIsRequired false
166 #plistWriteBool >>$F IFPkgFlagOverwritePermissions false
168 if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
169 plistWriteBool >>$F IFPkgFlagRelocatable true
171 plistWriteBool >>$F IFPkgFlagRelocatable false
174 plistWriteString >>$F IFPkgFlagRestartAction NoRestart
175 plistWriteBool >>$F IFPkgFlagRootVolumeOnly false
176 plistWriteBool >>$F IFPkgFlagUpdateInstalledLanguages false
177 #plistWriteBool >>$F IFPkgFlagUseUserMask false
178 plistWriteReal >>$F IFPkgFormatVersion "${INSTALLER_FORMAT_KEY}"
180 plistWriteString >>$F IFPkgFlagComponentDirectory "../Packages"
182 # generate sub-package list
183 echo >>$F " <key>IFPkgFlagPackageList</key>"
185 for i in sope-xml sope-core sope-mime sope-appserver; do
186 genSubPkgEntry >>$F $i.pkg required
188 for i in sope-ical sope-ldap sope-gdl1 sopex; do
189 genSubPkgEntry >>$F $i.pkg selected
191 echo >>$F " </array>"
196 if test "x$CHECK_XML" = "xyes"; then
203 function genVersionPList() {
204 # http://developer.apple.com/documentation/DeveloperTools/Conceptual/
205 # SoftwareDistribution/Concepts/sd_pkg_flags.html
206 F="${PKG_DIR}/Contents/version.plist"
207 echo -n " gen version.plist: $F .."
209 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
210 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
211 echo >>$F "<plist version=\"1.0\">"
214 # TODO: find out about BuildVersion
215 plistWriteString >>$F BuildVersion 4
217 plistWriteString >>$F CFBundleShortVersionString "${PKG_VERSION}"
218 plistWriteString >>$F ProjectName "${PKG_NAME}"
219 plistWriteString >>$F SourceVersion ${PKG_MAJOR_VERSION}${PKG_MINOR_VERSION}000
224 if test "x$CHECK_XML" = "xyes"; then
231 function genEnDescription() {
232 F="${PKG_RSRC_DIR}/English.lproj/Description.plist"
233 echo -n " gen description plist: $F .."
235 echo >$F "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
236 echo >>$F "<!DOCTYPE plist PUBLIC \"${PLIST_DT_ID}\" \"${PLIST_DT_LOC}\">"
237 echo >>$F "<plist version=\"1.0\">"
240 plistWriteString >>$F IFPkgDescriptionDescription "${PKG_NAME}"
241 plistWriteString >>$F IFPkgDescriptionTitle "${PKG_NAME}"
242 plistWriteString >>$F IFPkgDescriptionVersion "${PKG_VERSION}"
246 if test "x$CHECK_XML" = "xyes"; then
252 function genInfoFile() {
253 F="${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info"
254 echo -n " gen info file: $F .."
256 echo >$F "Title ${PKG_NAME}"
257 echo >>$F "Version ${PKG_VERSION}"
258 echo >>$F "Description ${PKG_VERSION}"
260 # TODO: find documentation for this one
261 # echo >>$F "PackageLocation ../Packages"
262 echo >>$F "FastInstall NO"
264 echo >>$F "Require Reboot NO" # TODO: consolidate
265 echo >>$F "OverwritePermissions NO" # TODO: consolidate
266 echo >>$F "UseUserMask NO" # TODO: consolidate
267 echo >>$F "RootVolumeOnly NO" # TODO: consolidate
269 if test "x${PKG_AUTHORIZATION}" = "x"; then
270 echo >>$F "NeedsAuthorization NO"
272 # need to check Admin/Root?
273 echo >>$F "NeedsAuthorization YES"
276 echo >>$F "DefaultLocation /" # TODO: consolidate
278 if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
279 echo >>$F "Relocatable YES"
281 echo >>$F "Relocatable NO"
284 #echo >>$F "Install Fat YES" # TODO: consolidate
285 echo >>$F "LibrarySubdirectory Standard"
288 cd "${PKG_RSRC_DIR}/English.lproj/"
289 ln -s "${PKG_NAME}.info" Install.info
295 function genPkgInfoFile() {
296 F="${PKG_DIR}/Contents/PkgInfo"
297 echo -n " gen PkgInfo: $F .."
302 function genPkgVersionFile() {
303 F="${PKG_RSRC_DIR}/package_version"
304 echo -n " gen package_version: $F .."
305 echo >$F "major: ${PKG_MAJOR_VERSION}"
306 echo >>$F "minor: ${PKG_MINOR_VERSION}"
310 function genRequiredPkgs() {
311 F="${PKG_RSRC_DIR}/Install.list"
312 echo -n " gen Install.list (requirements): $F .."
313 echo >$F "BSD.pkg:required"
314 echo >>$F "BSDSDK.pkg:required"
315 echo >>$F "DeveloperTools.pkg:required"
320 # ****************************** resources ****************************
322 function copyBackgroundImage() {
323 if test -f "${BACKGROUND_TIFF}"; then
324 cp "${BACKGROUND_TIFF}" "${PKG_RSRC_DIR}/background.tiff"
326 echo "ERROR: did not find background image: ${BACKGROUND_TIFF}"
330 function copyLicenseFile() {
331 if test -f "${LICENSE_FILE}"; then
332 cp "${LICENSE_FILE}" "${PKG_RSRC_DIR}/English.lproj/License.rtf"
334 echo "ERROR: did not find file: ${LICENSE_FILE}"
337 function copyWelcomeFile() {
338 if test -f "${WELCOME_FILE}"; then
339 cp "${WELCOME_FILE}" "${PKG_RSRC_DIR}/English.lproj/Welcome.rtf"
341 echo "ERROR: did not find file: ${WELCOME_FILE}"
346 # ****************************** debugging ****************************
348 function debugShowResults() {
350 echo "prepared contents:"
351 find -s $PKG_BUILD_DIR \
352 | sed "sX${PKG_BUILD_DIR}/X Xg"
356 # ****************************** sudo *********************************
358 function ensureSudo() {
359 # this will bring up the 'sudo' authentication
360 if test "x$USER" != "xroot"; then
361 echo "We need to run some commands using 'sudo', so please enter your "
362 echo "credentials when being asked for them (unless you already did so)"
363 sudo touch /tmp/osx-pkg-sudo-tmp
364 sudo rm /tmp/osx-pkg-sudo-tmp
369 # ****************************** sudo *********************************
371 function copyPackages() {
373 cp -R $i "${ROOT_DIR}"/
378 # ****************************** running ******************************
380 echo "Building SOPE MacOSX Installer.app multipackage $PKG_NAME.mpkg .."
401 # debugging, print results