]> err.no Git - sope/blob - maintenance/make-osxmpkg.sh
fixed some NGMail framework build issue
[sope] / maintenance / make-osxmpkg.sh
1 #!/bin/sh
2 #
3 # make-osxmpkg.sh
4 #
5 # Create a MacOSX Installer *multi* package for SOPE.
6 #
7
8 PKG_NAME="$1"
9
10 oldpwd="$PWD"
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"
14 PKG_VERSION="4.5"
15 ROOT_DIR="$PKG_BUILD_DIR/Packages"
16
17 CHECK_XML="yes"
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"
21
22 BACKGROUND_TIFF="maintenance/package-background.tiff"
23 LICENSE_FILE="maintenance/License.rtf"
24 WELCOME_FILE="maintenance/Welcome.rtf"
25
26 MKDIRS="mkdirhier"
27 CHMOD="chmod"
28 CHOWN="chown"
29 CHGRP="chgrp"
30 SUDO="sudo"
31 RM_R="rm -r"
32
33
34 # ****************************** usage ********************************
35
36 function usage() {
37   cat <<_ACEOF
38 make-osxmpkg.sh <pkgname>
39 _ACEOF
40 }
41
42
43 # ****************************** validate cmdline args ****************
44
45 function validateArgs() {
46   if test "x$PKG_NAME" = "x"; then
47     usage;
48     exit 1
49   fi
50 }
51
52
53 # ****************************** prepare/cleanup tmpfiles *************
54
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
59     echo ".. done."
60   fi
61
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."
69 }
70
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"
78   echo ".. done."
79 }
80
81 function cleanupTmpDirs() {
82   if test -d $PKG_BUILD_DIR; then
83     echo -n "  deleting builddir: $PKG_BUILD_DIR .."
84     rm -r $PKG_BUILD_DIR
85     echo ".. done."
86   fi
87 }
88
89
90 # ****************************** info files ***************************
91
92 function plistWriteString() {
93   echo "    <key>$1</key>"
94   echo "    <string>$2</string>"
95 }
96 function plistWriteInt() {
97   echo "    <key>$1</key>"
98   echo "    <integer>`echo $2`</integer>"
99 }
100 function plistWriteReal() {
101   echo "    <key>$1</key>"
102   echo "    <real>`echo $2`</real>"
103 }
104 function plistWriteDate() {
105   echo "    <key>$1</key>"
106   echo "    <date>$2</date>"
107 }
108 function plistWriteBool() {
109   echo "    <key>$1</key>"
110   echo "    <$2/>"
111 }
112
113 function genSubPkgEntry {
114   echo "      <dict>"
115   echo "        <key>IFPkgFlagPackageLocation</key>"
116   echo "        <string>$1</string>"
117   echo "        <key>IFPkgFlagPackageSelection</key>"
118   echo "        <string>$2</string>"
119   echo "      </dict>"
120 }
121
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 .."
127   
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\">"
131   echo >>$F "  <dict>"
132
133   plistWriteString >>$F IFMajorVersion 4
134   plistWriteString >>$F IFMinorVersion 5
135
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}"
153   
154   plistWriteString >>$F IFPkgFlagComponentDirectory "../Packages"
155   
156   # generate sub-package list
157   echo >>$F "    <key>IFPkgFlagPackageList</key>"
158   echo >>$F "    <array>"
159   for i in sope-xml sope-core sope-mime sope-appserver; do
160     genSubPkgEntry >>$F $i.pkg required
161   done
162   for i in sope-ical sope-ldap sope-gdl1 sopex; do
163     genSubPkgEntry >>$F $i.pkg selected
164   done
165   echo >>$F "    </array>"
166   
167   # close plist
168   echo >>$F "  </dict>"
169   echo >>$F "</plist>"
170   if test "x$CHECK_XML" = "xyes"; then
171     xmllint --noout $F
172   fi
173   
174   echo ".. done."
175 }
176
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 .."
182   
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\">"
186   echo >>$F "  <dict>"
187
188   plistWriteString >>$F BuildVersion               4
189   plistWriteString >>$F CFBundleShortVersionString "4.5"
190   plistWriteString >>$F ProjectName                "${PKG_NAME}"
191   plistWriteString >>$F SourceVersion              45000
192   
193   # close plist
194   echo >>$F "  </dict>"
195   echo >>$F "</plist>"
196   if test "x$CHECK_XML" = "xyes"; then
197     xmllint --noout $F
198   fi
199   
200   echo ".. done."
201 }
202
203 function genEnDescription() {
204   F="${PKG_RSRC_DIR}/English.lproj/Description.plist"
205   echo -n "  gen description plist: $F .."
206   
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\">"
210   echo >>$F "  <dict>"
211   
212   plistWriteString >>$F IFPkgDescriptionDescription "${PKG_NAME}"
213   plistWriteString >>$F IFPkgDescriptionTitle       "${PKG_NAME}"
214   plistWriteString >>$F IFPkgDescriptionVersion     "${PKG_VERSION}"
215   
216   echo >>$F "  </dict>"
217   echo >>$F "</plist>"
218   if test "x$CHECK_XML" = "xyes"; then
219     xmllint --noout $F
220   fi
221   echo ".. done."
222 }
223
224 function genInfoFile() {
225   F="${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info"
226   echo -n "  gen info file: $F .."
227   
228   echo >$F  "Title                 ${PKG_NAME}"
229   echo >>$F "Version               ${PKG_VERSION}"
230   echo >>$F "Description           ${PKG_VERSION}"
231   
232   echo >>$F "PackageLocation      ../"
233   echo >>$F "FastInstall          NO"
234   
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"
244   
245   ln -s ${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info \
246         ${PKG_RSRC_DIR}/English.lproj/Install.info
247   echo ".. done."
248 }
249
250
251 function genPkgInfoFile() {
252   F="${PKG_DIR}/Contents/PkgInfo"
253   echo -n "  gen PkgInfo: $F .."
254   echo >$F "pmkrpkg1"
255   echo ".. done."
256 }
257
258 function genPkgVersionFile() {
259   F="${PKG_RSRC_DIR}/package_version"
260   echo -n "  gen package_version: $F .."
261   echo >$F  "major: 4"
262   echo >>$F "minor: 5"
263   echo ".. done."
264 }
265
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"
272   echo ".. done."
273 }
274
275
276 # ****************************** resources ****************************
277
278 function copyBackgroundImage() {
279   if test -f "${BACKGROUND_TIFF}"; then
280     cp "${BACKGROUND_TIFF}" "${PKG_RSRC_DIR}/background.tiff"
281   else
282     echo "ERROR: did not find background image: ${BACKGROUND_TIFF}"
283   fi
284 }
285
286 function copyLicenseFile() {
287   if test -f "${LICENSE_FILE}"; then
288     cp "${LICENSE_FILE}" "${PKG_RSRC_DIR}/English.lproj/License.rtf"
289   else
290     echo "ERROR: did not find file: ${LICENSE_FILE}"
291   fi
292 }
293 function copyWelcomeFile() {
294   if test -f "${WELCOME_FILE}"; then
295     cp "${WELCOME_FILE}" "${PKG_RSRC_DIR}/English.lproj/Welcome.rtf"
296   else
297     echo "ERROR: did not find file: ${WELCOME_FILE}"
298   fi
299 }
300
301
302 # ****************************** debugging ****************************
303
304 function debugShowResults() {
305   echo ""
306   echo "prepared contents:"
307   find -s $PKG_BUILD_DIR \
308   | sed "sX${PKG_BUILD_DIR}/X  Xg"
309 }
310
311
312 # ****************************** sudo *********************************
313
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
321   fi
322 }
323
324
325 # ****************************** sudo *********************************
326
327 function copyPackages() {
328   for i in */*.pkg; do
329     cp -R $i "${ROOT_DIR}"/
330   done
331 }
332
333
334 # ****************************** running ******************************
335
336 echo "Building SOPE MacOSX Installer.app packages $PKG_NAME.mpkg .."
337 validateArgs;
338
339 ensureSudo;
340
341 prepareTmpDirs;
342 copyPackages;
343
344 genInfoPList;
345 genVersionPList;
346 genEnDescription;
347 genInfoFile;
348 genPkgInfoFile;
349 genRequiredPkgs;
350 genPkgVersionFile;
351
352 copyBackgroundImage;
353 copyLicenseFile;
354 copyWelcomeFile;
355
356
357 # debugging, print results
358 debugShowResults;
359
360
361 #cleanupTmpDirs;