Commit | Line | Data |
---|---|---|
4c3e985b AC |
1 | #!/bin/sh |
2 | ||
3 | #### make-package: create a Mac OS X package for use by the installer. | |
4 | #### The installer will place the Emacs OSX application in | |
5 | #### /Application/Emacs and the rest of emacs in the usual unix places | |
6 | #### under /usr/local or some other location if specified as the first | |
7 | #### argument. The disc image will be in the file EmacsInstaller.dmg. | |
8 | #### | |
9 | #### Upon installation, this will leave two versions of emacs on the | |
10 | #### computer, 20.7 and 21.1. | |
11 | #### | |
12 | #### Examples: | |
13 | #### ./make-package | |
14 | #### Will create an installer that will place the emacs support | |
15 | #### files inside /usr/local. | |
16 | #### ./make-package /usr | |
17 | #### Will create an installer that will place the emacs support | |
18 | #### files inside /usr. This will replace the default version of | |
19 | #### emacs included with Mac OS X. | |
20 | ||
21 | # Copyright (C) 2002 Free Software Foundation, Inc. | |
22 | # | |
23 | # This file is part of GNU Emacs. | |
24 | # | |
25 | # GNU Emacs is free software; you can redistribute it and/or modify | |
26 | # it under the terms of the GNU General Public License as published by | |
27 | # the Free Software Foundation; either version 2, or (at your option) | |
28 | # any later version. | |
29 | # | |
30 | # GNU Emacs is distributed in the hope that it will be useful, | |
31 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
32 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
33 | # GNU General Public License for more details. | |
34 | # | |
35 | # You should have received a copy of the GNU General Public License | |
36 | # along with GNU Emacs; see the file COPYING. If not, write to the | |
37 | # Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
38 | # Boston, MA 02111-1307, USA. | |
39 | # | |
40 | # Contributed by Steven Tamm (steventamm@mac.com). | |
41 | ||
42 | progname="$0" | |
e43e5c3e | 43 | |
876e727e | 44 | srcdir="`pwd`/.." |
52efaffc | 45 | builddir=${srcdir} |
876e727e ST |
46 | |
47 | ## Default location to place it is /usr/local | |
4c3e985b | 48 | prefix=/usr/local |
876e727e ST |
49 | appsdir=/Applications |
50 | emapp=Emacs.app | |
e43e5c3e | 51 | with_config=yes |
3f34081a ST |
52 | with_app=yes |
53 | with_x=no | |
17f8fc44 | 54 | comp_diskimage=no |
876e727e ST |
55 | self_contained=no |
56 | app_symlink=no | |
c4ea99e1 | 57 | full_dist=yes |
52efaffc | 58 | build_in_place=no |
876e727e | 59 | keep_directory=no |
e43e5c3e AC |
60 | |
61 | ac_prev= | |
62 | display_usage=false; | |
3f34081a | 63 | config_options=; |
e43e5c3e AC |
64 | while test $# != 0 |
65 | do | |
66 | if test -n "$ac_prev"; then | |
67 | eval "$ac_prev=\$1" | |
68 | ac_prev= | |
69 | continue | |
70 | fi | |
71 | case $1 in | |
72 | -help | --help | --hel | --he | -h) | |
73 | display_usage=yes ;; | |
74 | -p | -prefix | --p | --prefix) | |
75 | ac_prev=prefix ;; | |
76 | -p=* | -prefix=* | --p=* | --prefix=*) | |
77 | prefix=`expr "x$1" : 'x[^=]*=\(.*\)'` ;; | |
52efaffc ST |
78 | --build-in-place | --build-in-place ) |
79 | build_in_place=yes ;; | |
80 | --build-dir | -build-dir | --builddir | -build-dir) | |
81 | build_in_place=no | |
82 | ac_prev=builddir;; | |
83 | --build-dir=* | -build-dir=* | -builddir=* | --builddir=*) | |
84 | build_in_place=no | |
85 | builddir=`expr "x$1" : 'x[^=]*=\(.*\)'`;; | |
bfde2673 | 86 | -no-configure | -no-conf | --no-configure | --no-conf | --without-config) |
e43e5c3e | 87 | with_config=no ;; |
3f34081a ST |
88 | -no-app | --no-app | -without-app | --without-app) |
89 | with_app=no ;; | |
90 | -without-x | --without-x) | |
91 | with_x=no ;; | |
e43e5c3e | 92 | -with-x | --with-x) |
3f34081a ST |
93 | with_x=yes |
94 | with_app=no ;; | |
c4ea99e1 ST |
95 | --without-full-dist | -without-full-dist | -no-full-dist | -no-full) |
96 | full_dist=no ;; | |
ed324b45 | 97 | --self-contained | -self-contained | --with-self-contained-app | -sc) |
876e727e ST |
98 | self_contained=yes ;; |
99 | -app-symlink | --app-symlink | -symlink | --symlink | --asl) | |
100 | app_symlink=yes ;; | |
101 | --keep-dir) | |
102 | keep_directory=yes ;; | |
3f34081a ST |
103 | -C,* | -c,*) |
104 | config_options="$config_options `expr "x$1" : 'x[^,]*,\(.*\)'`" ;; | |
105 | -M,* | -m,*) | |
106 | make_options="$make_options `expr "x$1" : 'x[^,]*,\(.*\)'`" ;; | |
ed324b45 ST |
107 | *) |
108 | display_usage=yes ;; | |
e43e5c3e AC |
109 | esac |
110 | shift | |
111 | done | |
112 | ||
3f34081a ST |
113 | if test "$with_x" = "no"; then |
114 | config_options="--without-x $config_options" | |
115 | fi | |
116 | ||
e43e5c3e AC |
117 | if test "$display_usage" = "yes"; then |
118 | cat <<EOF | |
177c0ea7 JB |
119 | \`make-package' generates a Mac OS X installer package from an Emacs |
120 | distribution. By default, this first runs ./configure on the emacs | |
121 | directory. Then make install to create the emacs distribution. | |
122 | Then some mac-specific commands to generate the required information | |
3f34081a | 123 | for the mac package. The installer will, by default, create a |
876e727e ST |
124 | Carbon application called Emacs in the ${appsdir} directory, with the |
125 | shared emacs files in /usr/local | |
e43e5c3e AC |
126 | |
127 | Usage: $0 [OPTION] | |
128 | ||
129 | Options: | |
130 | -h, --help display this help and exit | |
131 | --prefix=DIR Set install location for the Mac OS X package | |
132 | of the emacs related file. By default /usr/local | |
133 | --no-conf Do not run the configure script before running | |
134 | make install. | |
3f34081a | 135 | --without-app Do not create the Emacs application bundle |
177c0ea7 | 136 | --with-x Setup the install to use X Windows for its |
3f34081a ST |
137 | windowed display, instead of carbon. Implies |
138 | --without-app. | |
c4ea99e1 ST |
139 | --without-full-dist Do not include all the .el files in the distribution. |
140 | This is discouraged except if disk space is critical. | |
876e727e ST |
141 | --app-symlink Have the Emacs.app executable be a symlink |
142 | to the install in [prefix]/bin/emacs and have | |
143 | the emacs executable link to emacs-${version} | |
144 | --self-contained Create an Emacs.app that is self-contained; | |
177c0ea7 JB |
145 | prefix will be ignored and all files installed |
146 | inside the application | |
52efaffc | 147 | --build-in-place Build the application in the source directory |
177c0ea7 | 148 | instead of a temporary directory. |
52efaffc ST |
149 | --build-dir=DIR Build the application in the specified directory |
150 | instead of a temporary directory. Mutually exclusive | |
151 | with --build-in-place. | |
3f34081a ST |
152 | -C,option Pass option to configure |
153 | -M,option Pass option to make | |
e43e5c3e AC |
154 | EOF |
155 | exit 0 | |
4c3e985b AC |
156 | fi |
157 | ||
4c3e985b AC |
158 | ### Exit if a command fails. |
159 | #set -e | |
160 | ||
161 | ### Print out each line we read, for debugging's sake. | |
876e727e | 162 | #set -v |
4c3e985b AC |
163 | |
164 | LANGUAGE=C | |
165 | LC_ALL=C | |
166 | LC_MESSAGES= | |
167 | LANG= | |
168 | export LANGUAGE LC_ALL LC_MESSAGES LANG | |
169 | ||
170 | ## Don't restrict access to any files. | |
171 | umask 0 | |
172 | ||
173 | ### Make sure we're running in the right place. | |
174 | if [ -f Emacs.pkg ]; then | |
175 | echo "${progname}: Package Emacs.pkg already exists. | |
176 | Perhaps a previous invocation of \`${progname}' failed to clean up after | |
177 | itself. Move or delete Emacs.pkg and try again." >&2 | |
178 | exit 1 | |
179 | fi | |
180 | ||
876e727e ST |
181 | if test $with_app == "yes" && [ ! -f ${emapp}/Contents/PkgInfo ]; then |
182 | echo "${progname}: Can't find \`${emapp}/Contents/PkgInfo'" >&2 | |
4c3e985b AC |
183 | echo "${progname} must be run in the \`mac' directory of the Emacs" >&2 |
184 | echo "distribution tree. cd to that directory and try again." >&2 | |
185 | exit 1 | |
186 | fi | |
187 | ||
188 | ### Check whether file ../lisp/version.el exists. | |
189 | if [ ! -f ../lisp/version.el ]; then | |
190 | echo "${progname}: Can't find \`../lisp/version.el'" >&2 | |
191 | exit 1 | |
192 | fi | |
193 | ||
194 | ### Find out which version of Emacs this is. | |
195 | shortversion=`grep 'defconst[ ]*emacs-version' ../lisp/version.el \ | |
196 | | sed -e 's/^.*"\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'` | |
197 | version=`grep 'defconst[ ]*emacs-version' ../lisp/version.el \ | |
198 | | sed -e 's/^[^"]*"\([^"]*\)".*$/\1/'` | |
199 | if [ ! "${version}" ]; then | |
200 | echo "${progname}: can't find current Emacs version in \`./lisp/version.el'" >&2 | |
201 | exit 1 | |
202 | fi | |
203 | ||
204 | echo Version numbers are $version and $shortversion | |
205 | ||
206 | ### Make sure we don't already have a directory emacs-${version}. | |
207 | ||
208 | emacsname="emacs-${version}${new_extension}" | |
209 | ||
210 | if [ -d ${emacsname} ] | |
211 | then | |
212 | echo Directory "${emacsname}" already exists >&2 | |
213 | exit 1 | |
214 | fi | |
215 | ||
216 | ### Make sure the subdirectory is available. | |
217 | tempparent="make-package.tmp.$$" | |
218 | if [ -d ${tempparent} ]; then | |
219 | echo "${progname}: staging directory \`${tempparent}' already exists. | |
220 | Perhaps a previous invocation of \`${progname}' failed to clean up after | |
221 | itself. Check that directories whose names are of the form | |
222 | \`make-dist.tmp.NNNNN' don't contain any important information, remove | |
223 | them, and try again." >&2 | |
224 | exit 1 | |
225 | fi | |
226 | ||
227 | if [ -d /Volumes/Emacs ]; then | |
228 | echo "${progname}: Already have an Emacs disc image mounted. Please | |
229 | eject that disc image and try again." >&2 | |
230 | exit 1 | |
231 | fi | |
232 | ||
233 | tempparentfull="`pwd`/${tempparent}" | |
876e727e | 234 | tempparentdist=${tempparentfull}/dist |
4c3e985b | 235 | |
52efaffc ST |
236 | if test "$build_in_place" = "no"; then |
237 | case ${builddir} in | |
238 | ${srcdir}) | |
239 | tempbuild="make-package.build.$$" | |
240 | builddir="`pwd`/${tempbuild}" | |
241 | removable_build_dir=${builddir} | |
cbcf7a8e | 242 | mkdir -p ${builddir} |
52efaffc ST |
243 | ;; |
244 | [\\/]* | ?:[\\/]* ) #Absolutepath. | |
245 | mkdir -p ${builddir} | |
246 | ;; | |
247 | *) | |
248 | mkdir -p ${builddir} | |
249 | builddir=`cd $builddir && pwd` | |
250 | ;; | |
251 | esac | |
252 | fi | |
253 | # Location of install package | |
254 | packagedir=${builddir}/mac/Emacs.pkg | |
255 | ||
256 | echo Building in directory ${builddir} | |
4c3e985b AC |
257 | echo Installing into directory ${tempparentfull} >&2 |
258 | ||
52efaffc ST |
259 | ### This trap ensures that the staging directory will be cleaned up even |
260 | ### when the script is interrupted in mid-career. | |
261 | trap "echo 'Interrupted...cleaning up the staging directory'; rm -rf ${tempparent} ${removable_build_dir} ${packagedir}; exit 1" 1 2 15 | |
262 | ||
876e727e ST |
263 | # Run configure in the new tempparent directory |
264 | if test "$with_config" = "yes"; then | |
52efaffc | 265 | (cd ${builddir}; ${srcdir}/configure ${config_options} --prefix=${prefix}) |
876e727e ST |
266 | fi |
267 | ||
268 | installprefix=${tempparentfull}${prefix} | |
269 | if test "$self_contained" = "yes"; then | |
270 | # If selfcontained, the local directory is Resources directory | |
271 | installprefix=$tempparentfull/$appsdir/$emapp/Contents/Resources | |
e43e5c3e AC |
272 | fi |
273 | ||
77a4e329 ST |
274 | |
275 | make_options="prefix=${installprefix} $make_options" | |
276 | ||
277 | if test "$with_app" = "yes"; then | |
278 | make_options="carbon_appdir=${tempparentfull}/Applications $make_options" | |
279 | fi | |
280 | ||
bfde2673 | 281 | ## Make bootstrap if .elc files are missing from distribution |
52efaffc | 282 | if [ ! -f ${srcdir}/lisp/abbrev.elc ]; then |
bfde2673 | 283 | echo "Required .elc files missing; making bootstrap..." |
77a4e329 | 284 | if ! (cd ${builddir}; make bootstrap $make_options); then |
bfde2673 ST |
285 | echo "Make bootstrap failed... Aborting make-package." |
286 | exit 2 | |
287 | fi | |
288 | fi | |
289 | ||
77a4e329 | 290 | if ! (cd ${builddir}; make install $make_options); then |
bfde2673 ST |
291 | echo "Make failed... Aborting make-package." |
292 | exit 1 | |
293 | fi | |
4c3e985b | 294 | |
876e727e ST |
295 | if test "$full_dist" == "no"; then |
296 | echo "Removing unneeded .el files" | |
297 | sharedir=$installprefix/share/emacs/$version | |
298 | find $sharedir/lisp $sharedir/leim -name "*.elc" -print | sed 's|\(.*\)\.elc$|/bin/rm -f \1.el|' | /bin/sh -s | |
299 | fi | |
300 | ||
3f34081a | 301 | if test "$with_app" == "yes"; then |
876e727e ST |
302 | echo "Creating Emacs.app application" |
303 | tempappdir=${tempparentfull}${appsdir} | |
ed324b45 | 304 | tempemapp=${tempappdir}/${emapp}/Contents/MacOS/Emacs |
3f34081a | 305 | ## Delete any CVS files |
810e89c7 | 306 | find ${tempappdir} -name "CVS" -type d -exec rm -rf {} \; |
ed324b45 | 307 | |
876e727e ST |
308 | ## Have application be a symlink to ${prefix}/bin/emacs |
309 | if test "$app_symlink" == "yes"; then | |
310 | echo "Creating application symlink" | |
876e727e | 311 | rm ${tempemapp} |
ed324b45 | 312 | ln -s ${prefix}/bin/${emacsname} ${tempemapp} |
876e727e | 313 | fi |
3f34081a | 314 | fi |
4c3e985b | 315 | |
afc9c9e4 ST |
316 | compver=powerpc-apple-darwin`uname -r` |
317 | ||
ed324b45 ST |
318 | if test "$self_contained" = "yes"; then |
319 | # Move shared files down to Resources directory | |
320 | mv $installprefix/share/emacs/$version/* $installprefix | |
321 | rm -rf $installprefix/share | |
322 | # These directories might remain in Resources | |
323 | mv $installprefix/bin $installprefix/../MacOS/bin | |
afc9c9e4 | 324 | mv $installprefix/libexec/emacs/$version/$compver $installprefix/../MacOS/libexec |
ed324b45 ST |
325 | # Make the application binary a hard link |
326 | rm $installprefix/../MacOS/Emacs | |
327 | ln $installprefix/../MacOS/bin/emacs $installprefix/../MacOS/Emacs | |
328 | fi | |
329 | ||
330 | ||
876e727e ST |
331 | # Remove unnecessary .el files |
332 | #if test "$full_dist" = no; then | |
333 | #fi | |
334 | ||
4c3e985b AC |
335 | echo "Creating Package Info file" |
336 | ||
cbcf7a8e | 337 | mkdir -p ${packagedir} |
52efaffc ST |
338 | mkdir ${packagedir}/Contents |
339 | mkdir ${packagedir}/Contents/Resources | |
340 | mkdir ${packagedir}/Contents/Resources/English.lproj | |
17f8fc44 ST |
341 | echo -n 'pmkrpkg1' > ${packagedir}/Contents/PkgInfo |
342 | ||
343 | # Create ReadMe and License files | |
344 | cp ${srcdir}/COPYING ${packagedir}/Contents/Resources/License.txt | |
345 | cp ${srcdir}/mac/README ${packagedir}/Contents/Resources/ReadMe.txt | |
4c3e985b | 346 | |
52efaffc | 347 | infofile=${packagedir}/Contents/Resources/English.lproj/Emacs.info |
4c3e985b | 348 | |
52efaffc | 349 | echo 'Title GNU Emacs' > ${infofile} |
4c3e985b AC |
350 | echo "Version ${version}" >> ${infofile} |
351 | echo "Description Install GNU Emacs ${version} as a command-line app and a Mac OS Application" >> ${infofile} | |
352 | echo 'DefaultLocation /' >> ${infofile} | |
353 | echo 'DeleteWarning' >> ${infofile} | |
354 | echo 'NeedsAuthorization YES' >> ${infofile} | |
355 | echo 'Required NO' >> ${infofile} | |
356 | echo 'Relocatable NO' >> ${infofile} | |
357 | echo 'RequiresReboot NO' >> ${infofile} | |
358 | echo 'UseUserMask NO' >> ${infofile} | |
359 | echo 'OverwritePermissions NO' >> ${infofile} | |
360 | echo 'InstallFat NO' >> ${infofile} | |
361 | ||
177c0ea7 | 362 | ### Set the install directory to install files as root... |
876e727e ST |
363 | ### Not sure if this is a good diea |
364 | # echo "Setting owner to root" | |
365 | # chown -Rh 0 ${tempparentfull} | |
366 | ||
4c3e985b | 367 | echo "Creating pax file" |
52efaffc | 368 | (cd ${tempparentfull}; pax -w -f ${packagedir}/Contents/Resources/Emacs.pax .) |
876e727e | 369 | echo "Compressing pax file" |
52efaffc | 370 | gzip ${packagedir}/Contents/Resources/Emacs.pax |
4c3e985b AC |
371 | |
372 | echo "Creating bom file" | |
52efaffc | 373 | mkbom ${tempparentfull} ${packagedir}/Contents/Resources/Emacs.bom |
4c3e985b AC |
374 | |
375 | echo "Generating sizes file" | |
52efaffc | 376 | sizesfile=${packagedir}/Contents/Resources/Emacs.sizes |
4c3e985b | 377 | |
5ea7adcc ST |
378 | numFiles=`du -a ${tempparent} | wc -l` |
379 | installedSize=`du -s ${tempparent} | cut -f1` | |
52efaffc | 380 | compressedSize=`du -s ${packagedir} | cut -f1` |
4c3e985b AC |
381 | |
382 | echo "NumFiles ${numFiles}" > ${sizesfile} | |
383 | echo "InstalledSize ${installedSize}" >> ${sizesfile} | |
384 | echo "CompressedSize ${compressedSize}" >> ${sizesfile} | |
385 | cat ${sizesfile} | |
386 | ||
4c3e985b | 387 | echo "Creating Disc Image" |
8472b9cf AC |
388 | ## From hdiutil man page, a sector is 512k. Allocate an extra 5% for |
389 | ## directories and partition tables. | |
390 | sectorsAlloced=`echo 2.1*${compressedSize}|bc` | |
52efaffc | 391 | hdiutil create -ov ${builddir}/mac/EmacsRW -sectors ${sectorsAlloced} |
4c3e985b | 392 | ## Need to format the disc image before mounting |
52efaffc | 393 | mountLoc=`hdid -nomount ${builddir}/mac/EmacsRW.dmg | grep HFS | cut -f1` |
4c3e985b AC |
394 | /sbin/newfs_hfs -v Emacs ${mountLoc} |
395 | hdiutil eject ${mountLoc} | |
396 | echo "Copying Package to Disc Image" | |
52efaffc | 397 | hdid ${builddir}/mac/EmacsRW.dmg |
4c3e985b | 398 | |
876e727e | 399 | if test "$keep_directory" = "no"; then |
52efaffc ST |
400 | rm -rf ${tempparentfull} |
401 | else | |
402 | mv ${tempparentfull} ${emacsname} | |
876e727e | 403 | fi |
4c3e985b AC |
404 | |
405 | if [ ! -d /Volumes/Emacs ]; then | |
876e727e | 406 | echo "Could not create disc image. The Emacs installer package (Emacs.pkg) |
177c0ea7 | 407 | in this directory should be correct. Please use the Disc Copy program to |
876e727e | 408 | create a disc image." >&2 |
4c3e985b AC |
409 | exit 0 |
410 | fi | |
411 | ||
52efaffc | 412 | cp -R ${packagedir} /Volumes/Emacs |
4c3e985b AC |
413 | |
414 | ## Converting Disk Image to read-only | |
415 | echo 'Converting Disc Image to read-only' | |
416 | hdiutil eject ${mountLoc} | |
52efaffc | 417 | hdiutil resize ${builddir}/mac/EmacsRW.dmg -sectors min |
876e727e | 418 | if test "$comp_diskimage" = "yes"; then |
52efaffc | 419 | hdiutil convert ${builddir}/mac/EmacsRW.dmg -format UDZO -imagekey zlib-level=2 -o ${srcdir}/mac/EmacsInstaller.dmg |
876e727e | 420 | else |
52efaffc | 421 | hdiutil convert ${builddir}/mac/EmacsRW.dmg -format UDRO -o ${srcdir}/mac/EmacsInstaller.dmg |
876e727e | 422 | fi |
52efaffc | 423 | rm ${builddir}/mac/EmacsRW.dmg |
4c3e985b AC |
424 | |
425 | echo "Cleaning up the staging directory" | |
52efaffc | 426 | rm -rf ${builddir}/mac/Emacs.pkg ${removable_build_dir} |
4c3e985b | 427 | |
ab5796a9 | 428 | # arch-tag: 1b631d0d-9fde-4f71-80c0-33e0e5815515 |
4c3e985b | 429 | ### make-package ends here |