177
|
1 #! /bin/sh
|
|
2 # emacs-fe --- front end driver for `emacs' and other programs
|
|
3
|
|
4 # Copyright (C) 1995, 1996 Noah S. Friedman
|
|
5
|
|
6 # Author: Noah Friedman <friedman@prep.ai.mit.edu>
|
|
7 # Created: 1995-09-11
|
|
8
|
|
9 # $.Id: emacs-fe,v 1.8 1996/03/07 04:32:33 friedman Exp $
|
|
10
|
|
11 # This program is free software; you can redistribute it and/or modify
|
|
12 # it under the terms of the GNU General Public License as published by
|
|
13 # the Free Software Foundation; either version 2, or (at your option)
|
|
14 # any later version.
|
|
15 #
|
|
16 # This program is distributed in the hope that it will be useful,
|
|
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
19 # GNU General Public License for more details.
|
|
20 #
|
|
21 # You should have received a copy of the GNU General Public License
|
|
22 # along with this program; if not, you can either send email to this
|
|
23 # program's maintainer or write to: The Free Software Foundation,
|
|
24 # Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
|
|
25
|
|
26 # Commentary:
|
|
27
|
|
28 # Inspired by a similar set of scripts by Charles Sandel <sandel@cli.com>,
|
|
29 # but generalized into this single script.
|
|
30
|
|
31 # Front-end shell script for GNU Emacs, used to manage multiple versions of
|
|
32 # Emacs and its associated utilities.
|
|
33 #
|
|
34 # Strategy: Install this script as "$prefix/bin/[progname]", for each
|
|
35 # program named [progname], (e.g. "emacs", "ispell", "etags", etc). These
|
|
36 # are the commands users would normally execute to run them.
|
|
37
|
|
38 # Give each version of emacs/xemacs/mule/ispell a separate hierarchy under
|
|
39 # $prefix/[emacs|xemacs|mule|ispell], with the name
|
|
40 # "[emacs|xemacs|mule|ispell]-NN.NN" where NN.NN is the version number.
|
|
41 # This script looks at what versions are available, and selects a version,
|
|
42 # currently whatever is specified by $DEFAULTLVERSION.
|
|
43
|
|
44 # However, users can specify their own choice to force the selection of a
|
|
45 # particular version by setting the environment variable PROGNAMEVERSION
|
|
46 # (e.g. EMACSVERSION, MULEVERSION, XEMACSVERSION, etc.) to have a value
|
|
47 # which is the version number of the program that they want to use (just
|
|
48 # the numeric value), or to specify either the NEWEST or OLDEST versions.
|
|
49
|
|
50 # Code:
|
|
51
|
|
52 # Name by which this script was invoked.
|
|
53 progname=`echo "$0" | sed -e 's/[^\/]*\///g'`
|
|
54
|
|
55 # To prevent hairy quoting and escaping later.
|
|
56 bq='`'
|
|
57 eq="'"
|
|
58
|
|
59 case "$progname" in
|
|
60 emacs-fe-print )
|
|
61 case $# in
|
|
62 1 ) : ;;
|
|
63 * )
|
|
64 echo "$progname: Exactly one argument is required." 1>&2
|
|
65 exit 1
|
|
66 ;;
|
|
67 esac
|
|
68
|
|
69 # sed is more portable than `dirname'
|
|
70 dir=`echo "$0" | sed -e 's/\/*$//' -e 's/\/[^\/]*$//'`
|
|
71 if test -f "$dir/$1"; then
|
|
72 EMACS_FE_PRINT=t
|
|
73 export EMACS_FE_PRINT
|
|
74 exec "$dir/$1"
|
|
75 fi
|
|
76
|
|
77 echo "$progname: $bq$dir/$1$eq does not seem to exist." 1>&2
|
|
78 exit 1
|
|
79 ;;
|
|
80 esac
|
|
81
|
|
82 DEFAULTVERSION="${DEFAULTVERSION-NEWEST}"
|
|
83 VARIANT="${EMACSVARIANT-emacs}"
|
|
84
|
|
85 if [ "$prefix" = "" ] ; then
|
|
86 # root of the GNU installed tree
|
|
87 prefix=/usr/local/gnu
|
|
88 fi
|
|
89
|
|
90 if [ ! -d "$prefix" ] ; then
|
|
91 echo "Cannot find root of GNU tree ($prefix)."
|
|
92 exit 1
|
|
93 fi
|
|
94
|
|
95 case "$progname" in
|
|
96 emacs | lemacs | xemacs | mule | ispell )
|
|
97 if [ "$eprefix" = "" ] ; then
|
|
98 # prefix name of the subdirectory
|
|
99 eprefix="${progname}/${progname}-"
|
|
100 fi
|
|
101 ;;
|
|
102 * )
|
|
103 eprefix="$VARIANT/${VARIANT}-"
|
|
104 ;;
|
|
105 esac
|
|
106
|
|
107 # Find out which versions are available on the system and sort them
|
|
108 # in numeric order.
|
|
109 #
|
|
110 # The largish sed script prefixes all version numbers with a sort key.
|
|
111 # That key is constructed by padding out any single or double digits to 3
|
367
|
112 # digits from the version number, then converting all occurrences of `.' to
|
177
|
113 # `0', and prefixing and suffixing the entire result with an additional
|
|
114 # zero. After sorting, the sort key is stripped from the output.
|
|
115 # We do all this because `sort' cannot numerically sort decimal numbers and
|
|
116 # will stop on the first `.'.
|
|
117 # This may not work correctly if the version number has more than 4 levels
|
|
118 # of minor versions (e.g. "1.2.3.4.5" may cause problems).
|
|
119 availversions=`ls -1d $prefix/${eprefix}*/. 2> /dev/null \
|
|
120 | sed -n \
|
|
121 -e "s#^$prefix/$eprefix\([0-9.][0-9.]*\)/\.*#\1#" \
|
|
122 -e 'h
|
|
123 s/[^.]*[^0-9.][^.]*\.//g
|
|
124 :0
|
|
125 /[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*\.[0-9.][0-9.]*/!{
|
|
126 s/$/.0/
|
|
127 b 0
|
|
128 }
|
|
129 s/^/./
|
|
130 s/$/./
|
|
131 :1
|
|
132 s/\.\([0-9]\)\./.00\1./g
|
|
133 s/\.\([0-9][0-9]\)\./.0\1./g
|
|
134 t 1
|
|
135 s/\./0/g
|
|
136 G
|
|
137 s/\n/ /' \
|
|
138 -e 'p' \
|
|
139 | sort -nu \
|
|
140 | sed -e 's/.* //'`
|
|
141
|
|
142 if [ "$availversions" = "" ] ; then
|
|
143 echo "No version of $progname found in $prefix/$eprefix*."
|
|
144 exit 1
|
|
145 fi
|
|
146
|
|
147 # This sets `oldest' to the oldest version available, and `newest'
|
|
148 # to the newest version available.
|
|
149 # On line 1, we save the original pattern in the hold space and restore it
|
|
150 # in case it is the only line of input.
|
|
151 eval `echo "$availversions" \
|
|
152 | sed -ne '1{h;s/^/oldest=/p;g;}
|
|
153 ${s/^/newest=/p;}
|
|
154 '`
|
|
155
|
|
156 # The environment variable [progname]VERSION can have a value which specifies
|
|
157 # a version number, OR it can contain the values "NEWEST" or "OLDEST" to
|
|
158 # specify the newest or oldest version which was found.
|
|
159 sed_upcase='y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'
|
|
160
|
|
161 PROGNAME=`echo "$progname" | sed -e "$sed_upcase" -e 's/-/_/g'`
|
|
162 eval version=\"\$${PROGNAME}VERSION\"
|
|
163
|
|
164 # If there is no ETAGSVERSION, EMACSCLIENTVERSION, etc, then look for
|
|
165 # EMACSVERSION, XEMACSVERSION, or whatever the current variant is.
|
|
166 case "$version" in
|
|
167 '' )
|
|
168 case "$progname" in
|
|
169 ispell )
|
|
170 # If this is ispell and ISPELLVERSION isn't set, just use 3.1.
|
|
171 # We could run this script recursively with a flag indicating to
|
|
172 # find the current emacs variant and version and just print it out,
|
|
173 # but that is a very pathological case and is a lot of work.
|
|
174 version=3.1 ;;
|
|
175 * )
|
|
176 variant=`echo "$VARIANT" | sed -e "$sed_upcase"`
|
|
177 eval version=\"\$${variant}VERSION\"
|
|
178 case "$version" in
|
|
179 '' ) version="$DEFAULTVERSION" ;;
|
|
180 esac
|
|
181 ;;
|
|
182 esac
|
|
183 esac
|
|
184
|
|
185 case "$version" in
|
|
186 [Oo][Ll][Dd][Ee][Ss][Tt]) version="$oldest" ;;
|
|
187 [Nn][Ee][Ww][Ee][Ss][Tt]) version="$newest" ;;
|
|
188 '') version="$oldest" ;;
|
|
189 *)
|
|
190 if [ ! -d "$prefix/$eprefix$version" ] ; then
|
|
191 echo "$progname: $version: Cannot find requested version." 1>&2
|
|
192 version=
|
|
193 fi
|
|
194 ;;
|
|
195 esac
|
|
196
|
|
197 # If we don't have a version by now, then give up.
|
|
198 if [ "$version" = "" ] ; then
|
|
199 exec 1>&2
|
|
200 echo "$progname: Cannot determine which version to use."
|
|
201 case "$availversions" in
|
|
202 */* )
|
|
203 echo "Available versions are:"
|
|
204 for f in $availversions; do
|
|
205 echo " $f"
|
|
206 done | sort
|
|
207 ;;
|
|
208 * )
|
|
209 echo "Available versions are:" $availversions
|
|
210 ;;
|
|
211 esac
|
|
212 exit 1
|
|
213 fi
|
|
214
|
|
215 case "$progname" in
|
|
216 emacs | lemacs | xemacs | mule )
|
|
217 EMACSVARIANT=$progname
|
|
218 eval ${PROGNAME}VERSION=$version
|
|
219 eval export EMACSVARIANT ${PROGNAME}VERSION
|
|
220
|
|
221 case "$EMACSVARIANT-$version" in
|
|
222 emacs-18* ) ISPELLVERSION=4.0 ;;
|
|
223 emacs-19.[0-9] ) ISPELLVERSION=4.0 ;;
|
|
224 emacs-19.1[0-9] ) ISPELLVERSION=4.0 ;;
|
|
225 emacs-19.2[0-2] ) ISPELLVERSION=4.0 ;;
|
|
226 emacs-19.2[3-9] ) ISPELLVERSION=3.1 ;;
|
|
227 emacs-* ) ISPELLVERSION=3.1 ;;
|
|
228
|
|
229 lemacs-19.[0-9] ) ISPELLVERSION=3.0.09 ;;
|
|
230 lemacs-19.10 ) ISPELLVERSION=3.1 ;;
|
|
231
|
|
232 xemacs-* ) ISPELLVERSION=3.1 ;;
|
|
233
|
|
234 mule-* ) ISPELLVERSION=3.1 ;;
|
|
235 esac
|
|
236 export ISPELLVERSION
|
|
237 ;;
|
|
238 esac
|
|
239
|
|
240 case "$progname" in
|
|
241 xemacs )
|
|
242 # xemacs expects to use the keysym database in /usr/openwin, but that
|
|
243 # database doesn't define many of the keysyms it uses. Unless the user
|
|
244 # has already defined their own, specify the keysym database in X11.
|
|
245 XKEYSYMDB="${XKEYSYMDB-/usr/local/X11/lib/X11/XKeysymDB}"
|
|
246 export XKEYSYMDB
|
|
247
|
|
248 # Some versions of xemacs (e.g. 19.12) are dynamically linked against
|
|
249 # the openwin tooltalk library (libtt.so), so add openwin to the
|
|
250 # dynamic load path if necessary.
|
|
251 case "$LD_LIBRARY_PATH" in
|
|
252 *'/usr/openwin/lib'* ) : ;;
|
|
253 '' )
|
|
254 LD_LIBRARY_PATH=/usr/local/X11R5/lib:/usr/openwin/lib:/lib
|
|
255 export LD_LIBRARY_PATH
|
|
256 ;;
|
|
257 * )
|
|
258 LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/openwin/lib"
|
|
259 export LD_LIBRARY_PATH
|
|
260 ;;
|
|
261 esac
|
|
262 ;;
|
|
263 esac
|
|
264
|
|
265 # Set up the MANPATH so that the man pages for this version
|
|
266 # are searched first
|
|
267 if [ -d $prefix/$eprefix$version/man ] ; then
|
|
268 MANPATH=$prefix/$eprefix$version/man:$MANPATH
|
|
269 export MANPATH
|
|
270 fi
|
|
271
|
|
272 # There is no need to do this, and it can potentially cause problems,
|
|
273 # especially if a program like `xemacs' exists in that directory and gets
|
|
274 # run in subshells instead of this script.
|
|
275 #PATH=$prefix/$eprefix$version/bin:$PATH
|
|
276 #export PATH
|
|
277
|
|
278 searchdirs=`exec 2> /dev/null
|
|
279 cd $prefix/$eprefix$version \
|
|
280 && find bin \
|
|
281 libexec/$VARIANT/$version/* \
|
|
282 lib/$VARIANT/$version/* \
|
|
283 lib/$VARIANT-$version/* \
|
|
284 lib/$VARIANT/etc \
|
|
285 lib/etc \
|
|
286 -type d -print`
|
|
287
|
|
288 for dir in $searchdirs ; do
|
|
289 for p in $progname-$version $progname ; do
|
|
290 prog="$prefix/$eprefix$version/$dir/$p"
|
|
291
|
|
292 if test -f "$prog" ; then
|
|
293 case "${EMACS_FE_PRINT+set}" in
|
|
294 set )
|
|
295 echo "$prog"
|
|
296 exit 0
|
|
297 ;;
|
|
298 esac
|
|
299
|
|
300 exec "$prog" ${1+"$@"}
|
|
301 fi
|
|
302 done
|
|
303 done
|
|
304
|
|
305 exec 1>&2
|
|
306
|
|
307 echo "$progname: Cannot find $bq$progname-$version$eq or $bq$progname$eq in"
|
|
308
|
|
309 for d in $searchdirs ; do
|
|
310 ls -1d $prefix/$eprefix$version/$d 2> /dev/null \
|
|
311 | sed -e "s/^/$progname: /"
|
|
312 done
|
|
313
|
|
314 exit 1
|
|
315
|
|
316 # emacs-fe ends here
|