]> err.no Git - sope/blob - maintenance/make-osxmpkg.sh
adjust for SUSE 10.0
[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 # ****************************** options ******************************
35
36 # if we set this to 'yes', we get no 'upgrade' button on "reinstalls"
37 PKG_IS_RELOCATABLE=no
38
39 # RootAuthorization / AdminAuthorization
40 PKG_AUTHORIZATION=RootAuthorization
41
42
43 # ****************************** usage ********************************
44
45 function usage() {
46   cat <<_ACEOF
47 make-osxmpkg.sh <pkgname>
48 _ACEOF
49 }
50
51
52 # ****************************** validate cmdline args ****************
53
54 function validateArgs() {
55   if test "x$PKG_NAME" = "x"; then
56     usage;
57     exit 1
58   fi
59 }
60
61
62 # ****************************** prepare/cleanup tmpfiles *************
63
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
68     echo ".. done."
69   fi
70
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."
78 }
79
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"
87   echo ".. done."
88 }
89
90 function cleanupTmpDirs() {
91   if test -d $PKG_BUILD_DIR; then
92     echo -n "  deleting builddir: $PKG_BUILD_DIR .."
93     rm -r $PKG_BUILD_DIR
94     echo ".. done."
95   fi
96 }
97
98
99 # ****************************** info files ***************************
100
101 function plistWriteString() {
102   echo "    <key>$1</key>"
103   echo "    <string>$2</string>"
104 }
105 function plistWriteInt() {
106   echo "    <key>$1</key>"
107   echo "    <integer>`echo $2`</integer>"
108 }
109 function plistWriteReal() {
110   echo "    <key>$1</key>"
111   echo "    <real>`echo $2`</real>"
112 }
113 function plistWriteDate() {
114   echo "    <key>$1</key>"
115   echo "    <date>$2</date>"
116 }
117 function plistWriteBool() {
118   echo "    <key>$1</key>"
119   echo "    <$2/>"
120 }
121
122 function genSubPkgEntry {
123   echo "      <dict>"
124   echo "        <key>IFPkgFlagPackageLocation</key>"
125   echo "        <string>$1</string>"
126   echo "        <key>IFPkgFlagPackageSelection</key>"
127   echo "        <string>$2</string>"
128   echo "      </dict>"
129 }
130
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 .."
136   
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\">"
140   echo >>$F "  <dict>"
141
142   plistWriteString >>$F IFMajorVersion 4
143   plistWriteString >>$F IFMinorVersion 5
144
145   plistWriteDate   >>$F IFPkgBuildDate "`date -u +%Y-%m-%dT%H:%M:%SZ`"
146   plistWriteString >>$F IFPkgBuildVersion                 "${PKG_VERSION}"
147   #plistWriteBool   >>$F IFPkgFlagAllowBackRev             true
148
149   # allowed: AdminAuthorization, RootAuthorization, ??
150   plistWriteString >>$F IFPkgFlagAuthorizationAction      ${PKG_AUTHORIZATION}
151   
152   plistWriteString >>$F IFPkgFlagBackgroundAlignment      topright
153   plistWriteString >>$F IFPkgFlagBackgroundScaling        none
154   plistWriteString >>$F IFPkgFlagDefaultLocation          /
155   #plistWriteBool   >>$F IFPkgFlagFollowLinks              true
156
157   #plistWriteBool   >>$F IFPkgFlagInstallFat               true
158
159   #plistWriteBool   >>$F IFPkgFlagIsRequired               false
160   #plistWriteBool   >>$F IFPkgFlagOverwritePermissions     false
161
162   if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
163     plistWriteBool   >>$F IFPkgFlagRelocatable            true
164   else
165     plistWriteBool   >>$F IFPkgFlagRelocatable            false
166   fi
167   
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}"
173   
174   plistWriteString >>$F IFPkgFlagComponentDirectory "../Packages"
175   
176   # generate sub-package list
177   echo >>$F "    <key>IFPkgFlagPackageList</key>"
178   echo >>$F "    <array>"
179   for i in sope-xml sope-core sope-mime sope-appserver; do
180     genSubPkgEntry >>$F $i.pkg required
181   done
182   for i in sope-ical sope-ldap sope-gdl1 sopex; do
183     genSubPkgEntry >>$F $i.pkg selected
184   done
185   echo >>$F "    </array>"
186   
187   # close plist
188   echo >>$F "  </dict>"
189   echo >>$F "</plist>"
190   if test "x$CHECK_XML" = "xyes"; then
191     xmllint --noout $F
192   fi
193   
194   echo ".. done."
195 }
196
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 .."
202   
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\">"
206   echo >>$F "  <dict>"
207
208   plistWriteString >>$F BuildVersion               4
209   plistWriteString >>$F CFBundleShortVersionString "4.5"
210   plistWriteString >>$F ProjectName                "${PKG_NAME}"
211   plistWriteString >>$F SourceVersion              45000
212   
213   # close plist
214   echo >>$F "  </dict>"
215   echo >>$F "</plist>"
216   if test "x$CHECK_XML" = "xyes"; then
217     xmllint --noout $F
218   fi
219   
220   echo ".. done."
221 }
222
223 function genEnDescription() {
224   F="${PKG_RSRC_DIR}/English.lproj/Description.plist"
225   echo -n "  gen description plist: $F .."
226   
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\">"
230   echo >>$F "  <dict>"
231   
232   plistWriteString >>$F IFPkgDescriptionDescription "${PKG_NAME}"
233   plistWriteString >>$F IFPkgDescriptionTitle       "${PKG_NAME}"
234   plistWriteString >>$F IFPkgDescriptionVersion     "${PKG_VERSION}"
235   
236   echo >>$F "  </dict>"
237   echo >>$F "</plist>"
238   if test "x$CHECK_XML" = "xyes"; then
239     xmllint --noout $F
240   fi
241   echo ".. done."
242 }
243
244 function genInfoFile() {
245   F="${PKG_RSRC_DIR}/English.lproj/${PKG_NAME}.info"
246   echo -n "  gen info file: $F .."
247   
248   echo >$F  "Title                 ${PKG_NAME}"
249   echo >>$F "Version               ${PKG_VERSION}"
250   echo >>$F "Description           ${PKG_VERSION}"
251   
252   # TODO: find documentation for this one
253   # echo >>$F "PackageLocation      ../Packages"
254   echo >>$F "FastInstall          NO"
255   
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
260
261   if test "x${PKG_AUTHORIZATION}" = "x"; then
262     echo >>$F "NeedsAuthorization    NO"
263   else
264     # need to check Admin/Root?
265     echo >>$F "NeedsAuthorization    YES"
266   fi
267   
268   echo >>$F "DefaultLocation       /"   # TODO: consolidate
269   
270   if test "x${PKG_IS_RELOCATABLE}" = "xyes"; then
271     echo >>$F "Relocatable           YES"
272   else
273     echo >>$F "Relocatable           NO"
274   fi
275   
276   #echo >>$F "Install Fat           YES" # TODO: consolidate
277   echo >>$F "LibrarySubdirectory   Standard"
278
279   GIOLDDIR="$PWD"  
280   cd "${PKG_RSRC_DIR}/English.lproj/"
281   ln -s "${PKG_NAME}.info" Install.info
282   cd "$GIOLDDIR"
283   echo ".. done."
284 }
285
286
287 function genPkgInfoFile() {
288   F="${PKG_DIR}/Contents/PkgInfo"
289   echo -n "  gen PkgInfo: $F .."
290   echo >$F "pmkrpkg1"
291   echo ".. done."
292 }
293
294 function genPkgVersionFile() {
295   F="${PKG_RSRC_DIR}/package_version"
296   echo -n "  gen package_version: $F .."
297   echo >$F  "major: 4"
298   echo >>$F "minor: 5"
299   echo ".. done."
300 }
301
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"
308   echo ".. done."
309 }
310
311
312 # ****************************** resources ****************************
313
314 function copyBackgroundImage() {
315   if test -f "${BACKGROUND_TIFF}"; then
316     cp "${BACKGROUND_TIFF}" "${PKG_RSRC_DIR}/background.tiff"
317   else
318     echo "ERROR: did not find background image: ${BACKGROUND_TIFF}"
319   fi
320 }
321
322 function copyLicenseFile() {
323   if test -f "${LICENSE_FILE}"; then
324     cp "${LICENSE_FILE}" "${PKG_RSRC_DIR}/English.lproj/License.rtf"
325   else
326     echo "ERROR: did not find file: ${LICENSE_FILE}"
327   fi
328 }
329 function copyWelcomeFile() {
330   if test -f "${WELCOME_FILE}"; then
331     cp "${WELCOME_FILE}" "${PKG_RSRC_DIR}/English.lproj/Welcome.rtf"
332   else
333     echo "ERROR: did not find file: ${WELCOME_FILE}"
334   fi
335 }
336
337
338 # ****************************** debugging ****************************
339
340 function debugShowResults() {
341   echo ""
342   echo "prepared contents:"
343   find -s $PKG_BUILD_DIR \
344   | sed "sX${PKG_BUILD_DIR}/X  Xg"
345 }
346
347
348 # ****************************** sudo *********************************
349
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
357   fi
358 }
359
360
361 # ****************************** sudo *********************************
362
363 function copyPackages() {
364   for i in */*.pkg; do
365     cp -R $i "${ROOT_DIR}"/
366   done
367 }
368
369
370 # ****************************** running ******************************
371
372 echo "Building SOPE MacOSX Installer.app multipackage $PKG_NAME.mpkg .."
373 validateArgs;
374
375 ensureSudo;
376
377 prepareTmpDirs;
378 copyPackages;
379
380 genInfoPList;
381 genVersionPList;
382 genEnDescription;
383 genInfoFile;
384 genPkgInfoFile;
385 genRequiredPkgs;
386 genPkgVersionFile;
387
388 copyBackgroundImage;
389 copyLicenseFile;
390 copyWelcomeFile;
391
392
393 # debugging, print results
394 debugShowResults;
395
396
397 #cleanupTmpDirs;