update.
[chise/xemacs-chise.git.1] / etc / xemacs-fe.sh
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
112 # digits from the version number, then converting all occurrences of `.' to
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