Mercurial > hg > xemacs-beta
comparison lisp/find-paths.el @ 267:966663fcf606 r20-5b32
Import from CVS: tag r20-5b32
author | cvs |
---|---|
date | Mon, 13 Aug 2007 10:26:29 +0200 |
parents | |
children | b2472a1930f2 |
comparison
equal
deleted
inserted
replaced
266:18d185df8c54 | 267:966663fcf606 |
---|---|
1 ;;; find-paths.el --- setup various XEmacs paths | |
2 | |
3 ;; Copyright (C) 1985-1986, 1990, 1992-1997 Free Software Foundation, Inc. | |
4 ;; Copyright (c) 1993, 1994 Sun Microsystems, Inc. | |
5 ;; Copyright (C) 1995 Board of Trustees, University of Illinois | |
6 | |
7 ;; Author: Mike Sperber <sperber@informatik.uni-tuebingen.de> | |
8 ;; Maintainer: XEmacs Development Team | |
9 ;; Keywords: internal, dumped | |
10 | |
11 ;; This file is part of XEmacs. | |
12 | |
13 ;; XEmacs is free software; you can redistribute it and/or modify it | |
14 ;; under the terms of the GNU General Public License as published by | |
15 ;; the Free Software Foundation; either version 2, or (at your option) | |
16 ;; any later version. | |
17 | |
18 ;; XEmacs is distributed in the hope that it will be useful, but | |
19 ;; WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
21 ;; General Public License for more details. | |
22 | |
23 ;; You should have received a copy of the GNU General Public License | |
24 ;; along with XEmacs; see the file COPYING. If not, write to the | |
25 ;; Free Software Foundation, 59 Temple Place - Suite 330, | |
26 ;; Boston, MA 02111-1307, USA. | |
27 | |
28 ;;; Synched up with: Not in FSF. | |
29 | |
30 ;;; Commentary: | |
31 | |
32 ;; This file is dumped with XEmacs. | |
33 | |
34 ;; This file contains the library functionality to find paths into the | |
35 ;; XEmacs hierarchy. | |
36 | |
37 ;;; Code: | |
38 | |
39 (defvar paths-version-control-bases '("RCS" "CVS" "SCCS") | |
40 "File bases associated with version control.") | |
41 | |
42 (defun paths-find-recursive-path (directories &optional exclude) | |
43 "Return a list of the directory hierarchy underneath DIRECTORIES. | |
44 The returned list is sorted by pre-order and lexicographically." | |
45 (let ((path '())) | |
46 (while directories | |
47 (let ((directory (file-name-as-directory | |
48 (expand-file-name | |
49 (car directories))))) | |
50 (if (file-directory-p directory) | |
51 (let ((raw-dirs (directory-files directory nil "^[^-.]" nil 'dirs-only)) | |
52 (reverse-dirs '())) | |
53 | |
54 (while raw-dirs | |
55 (if (null (member (car raw-dirs) exclude)) | |
56 (setq reverse-dirs | |
57 (cons (expand-file-name (car raw-dirs) directory) | |
58 reverse-dirs))) | |
59 (setq raw-dirs (cdr raw-dirs))) | |
60 | |
61 (let ((sub-path | |
62 (paths-find-recursive-path (reverse reverse-dirs) exclude))) | |
63 (setq path (nconc path | |
64 (list directory) | |
65 sub-path)))))) | |
66 (setq directories (cdr directories))) | |
67 path)) | |
68 | |
69 (defun paths-find-recursive-load-path (directories) | |
70 "Construct a recursive load path underneath DIRECTORIES." | |
71 (paths-find-recursive-path directories paths-version-control-bases)) | |
72 | |
73 (defun paths-emacs-root-p (directory) | |
74 "Check if DIRECTORY is a plausible installation root for XEmacs." | |
75 (or | |
76 ;; installed | |
77 (file-directory-p | |
78 (concat directory "lib/xemacs-" (construct-emacs-version))) | |
79 ;; in-place | |
80 (and | |
81 (file-directory-p (concat directory "lib-src")) | |
82 (file-directory-p (concat directory "lisp")) | |
83 (file-directory-p (concat directory "src"))))) | |
84 | |
85 (defun paths-find-emacs-root | |
86 (invocation-directory invocation-name) | |
87 "Find the run-time root of XEmacs." | |
88 (let ((maybe-root-1 (file-name-as-directory | |
89 (expand-file-name ".." invocation-directory))) | |
90 (maybe-root-2 (file-name-as-directory | |
91 (expand-file-name "../.." invocation-directory)))) | |
92 (cond | |
93 ((paths-emacs-root-p maybe-root-1) | |
94 maybe-root-1) | |
95 ((paths-emacs-root-p maybe-root-2) | |
96 maybe-root-2) | |
97 (t | |
98 (let ((maybe-symlink (file-symlink-p (concat invocation-directory | |
99 invocation-name)))) | |
100 (if maybe-symlink | |
101 (let ((directory (file-name-directory maybe-symlink))) | |
102 (paths-find-emacs-root directory invocation-name)) | |
103 nil)))))) | |
104 | |
105 (defun paths-construct-emacs-directory (root suffix base) | |
106 "Construct a directory name within the XEmacs hierarchy." | |
107 (file-name-as-directory | |
108 (expand-file-name | |
109 (concat | |
110 (file-name-as-directory root) | |
111 suffix | |
112 base)))) | |
113 | |
114 (defun paths-find-emacs-directory (roots suffix base &optional envvar default) | |
115 "Find a directory in the XEmacs hierarchy. | |
116 ROOTS must be a list of installation roots. | |
117 SUFFIX is the subdirectory from there. | |
118 BASE is the base to look for. | |
119 ENVVAR is the name of the environment variable that might also | |
120 specify the directory. | |
121 DEFAULT is a fall-back value." | |
122 (let ((envvar-value (and envvar (getenv envvar)))) | |
123 (if (and envvar-value | |
124 (file-directory-p envvar-value)) | |
125 (file-name-as-directory envvar-value) | |
126 (catch 'gotcha | |
127 (while roots | |
128 (let* ((root (car roots)) | |
129 (path (paths-construct-emacs-directory root suffix base))) | |
130 ;; installed | |
131 (if (file-directory-p path) | |
132 (throw 'gotcha path) | |
133 (let ((path (paths-construct-emacs-directory root "" base))) | |
134 ;; in-place | |
135 (if (file-directory-p path) | |
136 (throw 'gotcha path))))) | |
137 (setq roots (cdr roots))) | |
138 (if (and default | |
139 (file-directory-p default)) | |
140 (file-name-as-directory default) | |
141 nil))))) | |
142 | |
143 (defun paths-find-site-directory (roots base &optional envvar default) | |
144 "Find a site-specific directory in the XEmacs hierarchy." | |
145 (paths-find-emacs-directory roots "lib/xemacs/" base envvar default)) | |
146 | |
147 (defun paths-find-version-directory (roots base &optional envvar default) | |
148 "Find a version-specific directory in the XEmacs hierarchy." | |
149 (paths-find-emacs-directory roots | |
150 (concat "lib/xemacs-" (construct-emacs-version) "/") | |
151 base | |
152 envvar default)) | |
153 | |
154 (defun paths-find-architecture-directory (roots base &optional envvar default) | |
155 "Find an architecture-specific directory in the XEmacs hierarchy." | |
156 (or | |
157 ;; from more to less specific | |
158 (paths-find-version-directory roots | |
159 (concat base system-configuration) | |
160 envvar default) | |
161 (paths-find-version-directory roots | |
162 system-configuration | |
163 envvar default) | |
164 (paths-find-version-directory roots | |
165 base | |
166 envvar default))) | |
167 | |
168 (defvar paths-path-emacs-version nil | |
169 "Emacs version as it appears in paths.") | |
170 | |
171 (defun construct-emacs-version () | |
172 "Construct the raw version number of XEmacs in the form XX.XX." | |
173 ;; emacs-version isn't available early, but we really don't care then | |
174 (if (null (boundp 'emacs-version)) | |
175 "XX.XX" | |
176 (or paths-path-emacs-version ; cache | |
177 (progn | |
178 (string-match "\\`[^0-9]*\\([0-9]+\\.[0-9]+\\)" emacs-version) | |
179 (let ((version (substring emacs-version | |
180 (match-beginning 1) (match-end 1)))) | |
181 (if (string-match "(beta *\\([0-9]+\\))" emacs-version) | |
182 (setq version (concat version | |
183 "-b" | |
184 (substring emacs-version | |
185 (match-beginning 1) (match-end 1))))) | |
186 (setq paths-path-emacs-version version) | |
187 version))))) | |
188 | |
189 (defun paths-find-emacs-path (roots suffix base &optional envvar default) | |
190 "Find a path in the XEmacs hierarchy. | |
191 ROOTS must be a list of installation roots. | |
192 SUFFIX is the subdirectory from there. | |
193 BASE is the base to look for. | |
194 ENVVAR is the name of the environment variable that might also | |
195 specify the path. | |
196 DEFAULT is a fall-back value." | |
197 (let ((envvar-value (and envvar (getenv envvar)))) | |
198 (if envvar-value | |
199 (decode-path-internal envvar-value) | |
200 (let ((directory (paths-find-emacs-directory roots base suffix))) | |
201 (if (and directory (file-directory-p directory)) | |
202 (list directory) | |
203 (paths-directories-which-exist default)))))) | |
204 | |
205 (defun paths-directories-which-exist (directories) | |
206 "Return the directories among DIRECTORIES." | |
207 (let ((reverse-directories '())) | |
208 (while directories | |
209 (if (file-directory-p (car directories)) | |
210 (setq reverse-directories | |
211 (cons (car directories) | |
212 reverse-directories))) | |
213 (setq directories (cdr directories))) | |
214 (reverse reverse-directories))) | |
215 | |
216 (defun paths-find-site-path (roots base &optional envvar default) | |
217 "Find a path underneath the site hierarchy." | |
218 (paths-find-emacs-path roots "lib/xemacs/" base envvar default)) | |
219 | |
220 (defun paths-find-version-path (roots base &optional envvar default) | |
221 "Find a path underneath the site hierarchy." | |
222 (paths-find-emacs-path roots | |
223 (concat "lib/xemacs-" (construct-emacs-version) "/") | |
224 base | |
225 envvar default)) | |
226 | |
227 (defun paths-find-emacs-roots (invocation-directory | |
228 invocation-name) | |
229 "Find all plausible installation roots for XEmacs." | |
230 (let ((invocation-root | |
231 (paths-find-emacs-root invocation-directory invocation-name)) | |
232 (installation-root | |
233 (if (and configure-prefix-directory | |
234 (file-directory-p configure-prefix-directory)) | |
235 configure-prefix-directory))) | |
236 (append (and invocation-root | |
237 (list invocation-root)) | |
238 (and installation-root | |
239 (list installation-root))))) | |
240 | |
241 ;;; find-paths.el ends here |