comparison lisp/setup-paths.el @ 267:966663fcf606 r20-5b32

Import from CVS: tag r20-5b32
author cvs
date Mon, 13 Aug 2007 10:26:29 +0200
parents 8efd647ea9ca
children b2472a1930f2
comparison
equal deleted inserted replaced
266:18d185df8c54 267:966663fcf606
29 29
30 ;;; Commentary: 30 ;;; Commentary:
31 31
32 ;; This file is dumped with XEmacs. 32 ;; This file is dumped with XEmacs.
33 33
34 ;; This file contains the machinery necessary to find the various 34 ;; This file describes and constructs the various paths into the
35 ;; paths into the XEmacs hierarchy. 35 ;; XEmacs hierarchy from a global viewpoint.
36 36
37 (defvar paths-version-control-bases '("RCS" "CVS" "SCCS") 37 ;; It requires find-paths.el and packages.el.
38 "File bases associated with version control.") 38
39 ;;; Code:
39 40
40 (defun paths-find-recursive-path (directories &optional exclude) 41 (defun paths-find-site-lisp-directory (roots)
41 "Return a list of the directory hierarchy underneath DIRECTORIES. 42 "Find the site Lisp directory of the XEmacs hierarchy."
42 The returned list is sorted by pre-order and lexicographically." 43 (paths-find-site-directory roots "site-lisp"
43 (let ((path '())) 44 nil
44 (while directories 45 configure-site-directory))
45 (let ((directory (file-name-as-directory
46 (expand-file-name
47 (car directories)))))
48 (if (file-directory-p directory)
49 (let ((raw-dirs (directory-files directory nil "^[^-.]" nil 'dirs-only))
50 (reverse-dirs '()))
51 46
52 (while raw-dirs 47 (defun paths-find-lisp-directory (roots)
53 (if (null (member (car raw-dirs) exclude)) 48 "Find the main Lisp directory of the XEmacs hierarchy."
54 (setq reverse-dirs 49 (paths-find-version-directory roots "lisp"
55 (cons (expand-file-name (car raw-dirs) directory) 50 nil
56 reverse-dirs))) 51 configure-lisp-directory))
57 (setq raw-dirs (cdr raw-dirs)))
58 52
59 (let ((sub-path 53 (defun paths-construct-load-path
60 (paths-find-recursive-path (reverse reverse-dirs) exclude))) 54 (roots early-package-load-path late-package-load-path
61 (setq path (nconc path 55 &optional inhibit-site-lisp)
62 (list directory)
63 sub-path))))))
64 (setq directories (cdr directories)))
65 path))
66
67 (defun paths-find-recursive-load-path (directories)
68 "Construct a recursive load path underneath DIRECTORIES."
69 (paths-find-recursive-path directories paths-version-control-bases))
70
71 (defun paths-emacs-root-p (directory)
72 "Check if DIRECTORY is a plausible installation root for XEmacs."
73 (or
74 ;; installed
75 (and (boundp 'emacs-version)
76 (file-directory-p
77 (concat directory "lib/xemacs-" (construct-emacs-version))))
78 ;; in-place
79 (and
80 (file-directory-p (concat directory "lib-src"))
81 (file-directory-p (concat directory "lisp"))
82 (file-directory-p (concat directory "src")))))
83
84 (defun paths-find-emacs-root
85 (invocation-directory invocation-name)
86 "Find the run-time root of XEmacs."
87 (let ((maybe-root-1 (file-name-as-directory
88 (expand-file-name ".." invocation-directory)))
89 (maybe-root-2 (file-name-as-directory
90 (expand-file-name "../.." invocation-directory))))
91 (cond
92 ((paths-emacs-root-p maybe-root-1)
93 maybe-root-1)
94 ((paths-emacs-root-p maybe-root-2)
95 maybe-root-2)
96 (t
97 (let ((maybe-symlink (file-symlink-p (concat invocation-directory
98 invocation-name))))
99 (if maybe-symlink
100 (let ((directory (file-name-directory maybe-symlink)))
101 (paths-find-emacs-root directory invocation-name))
102 nil))))))
103
104 (defun paths-construct-emacs-directory (root suffix base)
105 "Construct a directory name within the XEmacs hierarchy."
106 (file-name-as-directory
107 (expand-file-name
108 (concat
109 (file-name-as-directory root)
110 suffix
111 base))))
112
113 (defun paths-find-emacs-directory (roots suffix base &optional envvar default)
114 "Find a directory in the XEmacs hierarchy.
115 ROOTS must be a list of installation roots.
116 SUFFIX is the subdirectory from there.
117 BASE is the base to look for.
118 ENVVAR is the name of the environment variable that might also
119 specify the directory.
120 DEFAULT is a fall-back value."
121 (let ((envvar-value (and envvar (getenv envvar))))
122 (if (and envvar-value
123 (file-directory-p envvar-value))
124 (file-name-as-directory envvar-value)
125 (catch 'gotcha
126 (while roots
127 (let* ((root (car roots))
128 (path (paths-construct-emacs-directory root suffix base)))
129 ;; installed
130 (if (file-directory-p path)
131 (throw 'gotcha path)
132 (let ((path (paths-construct-emacs-directory root "" base)))
133 ;; in-place
134 (if (file-directory-p path)
135 (throw 'gotcha path)))))
136 (setq roots (cdr roots)))
137 (if (and default
138 (file-directory-p default))
139 (file-name-as-directory default)
140 nil)))))
141
142 (defun paths-find-site-directory (roots base &optional envvar default)
143 "Find a site-specific directory in the XEmacs hierarchy."
144 (paths-find-emacs-directory roots "lib/xemacs/" base envvar default))
145
146 (defun paths-find-version-directory (roots base &optional envvar default)
147 "Find a version-specific directory in the XEmacs hierarchy."
148 (paths-find-emacs-directory roots
149 (concat "lib/xemacs-" (construct-emacs-version) "/")
150 base
151 envvar default))
152
153 (defun paths-find-architecture-directory (roots base &optional envvar default)
154 "Find an architecture-specific directory in the XEmacs hierarchy."
155 (or
156 ;; from more to less specific
157 (paths-find-version-directory roots
158 (concat base system-configuration)
159 envvar default)
160 (paths-find-version-directory roots
161 system-configuration
162 envvar default)
163 (paths-find-version-directory roots
164 base
165 envvar default)))
166
167 (defvar paths-path-emacs-version nil
168 "Emacs version as it appears in paths.")
169
170 (defun construct-emacs-version ()
171 "Construct the raw version number of XEmacs in the form XX.XX."
172 ;; emacs-version isn't available early, but we really don't care then
173 (if (null (boundp 'emacs-version))
174 ""
175 (or paths-path-emacs-version ; cache
176 (progn
177 (string-match "\\`[^0-9]*\\([0-9]+\\.[0-9]+\\)" emacs-version)
178 (let ((version (substring emacs-version
179 (match-beginning 1) (match-end 1))))
180 (if (string-match "(beta *\\([0-9]+\\))" emacs-version)
181 (setq version (concat version
182 "-b"
183 (substring emacs-version
184 (match-beginning 1) (match-end 1)))))
185 (setq paths-path-emacs-version version)
186 version)))))
187
188 (defun paths-find-emacs-path (roots suffix base &optional envvar default)
189 "Find a path in the XEmacs hierarchy.
190 ROOTS must be a list of installation roots.
191 SUFFIX is the subdirectory from there.
192 BASE is the base to look for.
193 ENVVAR is the name of the environment variable that might also
194 specify the path.
195 DEFAULT is a fall-back value."
196 (let ((envvar-value (and envvar (getenv envvar))))
197 (if (and (fboundp 'parse-colon-path) envvar-value)
198 (parse-colon-path envvar-value)
199 (let ((directory (paths-find-emacs-directory roots base suffix)))
200 (if (and directory (file-directory-p directory))
201 (list directory)
202 (paths-directories-which-exist default))))))
203
204 (defun paths-directories-which-exist (directories)
205 "Return the directories among DIRECTORIES."
206 (let ((reverse-directories '()))
207 (while directories
208 (if (file-directory-p (car directories))
209 (setq reverse-directories
210 (cons (car directories)
211 reverse-directories)))
212 (setq directories (cdr directories)))
213 (reverse reverse-directories)))
214
215 (defun paths-find-site-path (roots base &optional envvar default)
216 "Find a path underneath the site hierarchy."
217 (paths-find-emacs-path roots "lib/xemacs/" base envvar default))
218
219 (defun paths-find-version-path (roots base &optional envvar default)
220 "Find a path underneath the site hierarchy."
221 (paths-find-emacs-path roots
222 (concat "lib/xemacs-" (construct-emacs-version) "/")
223 base
224 envvar default))
225
226 ; Packages are special ...
227
228 (defun paths-find-package-path (roots)
229 "Construct the package path underneath installation roots ROOTS."
230 (let ((envvar-value (getenv "EMACSPACKAGEPATH")))
231 (if (and (fboundp 'parse-colon-path) envvar-value)
232 (parse-colon-path envvar-value)
233 (let ((base-directory (paths-find-site-directory roots "packages")))
234 (if base-directory
235 (let ((mule-directory (and (featurep 'mule)
236 (paths-find-site-directory roots
237 "mule-packages"))))
238 (append '("~/.xemacs/")
239 '(nil)
240 (and mule-directory
241 (list mule-directory))
242 (list base-directory)))
243 configure-package-path)))))
244
245 (defvar paths-package-special-bases '("etc" "info" "lisp" "lib-src" "bin")
246 "Special subdirectories of packages.")
247
248 (defun paths-find-packages-in-directories (directories)
249 "Find all packages underneath directories in DIRECTORIES."
250 (paths-find-recursive-path directories
251 (append paths-version-control-bases
252 paths-package-special-bases)))
253
254 (defun paths-split-path (path)
255 "Split PATH at NIL, return pair with two components.
256 The second component is shared with PATH."
257 (let ((reverse-early '()))
258 (while (and path (null (null (car path))))
259 (setq reverse-early (cons (car path) reverse-early))
260 (setq path (cdr path)))
261 (if (null path)
262 (cons nil path)
263 (cons (reverse reverse-early) (cdr path)))))
264
265 (defun paths-find-packages (package-path)
266 "Search for all packages in PACKAGE-PATH.
267 PACKAGE-PATH may distinguish (by NIL-separation) between early
268 and late packages.
269 This returns (CONS EARLY-PACKAGES LATE-PACKAGES)."
270 (let* ((stuff (paths-split-path package-path))
271 (early (car stuff))
272 (late (cdr stuff)))
273 (cons (paths-find-packages-in-directories early)
274 (paths-find-packages-in-directories late))))
275
276 (defun paths-find-package-library-path (packages suffixes)
277 "Construct a path into a component of the packages hierarchy.
278 PACKAGES is a list of package directories.
279 SUFFIXES is a list of names of package subdirectories to look for."
280 (let ((directories
281 (apply
282 #'append
283 (mapcar #'(lambda (package)
284 (mapcar #'(lambda (suffix)
285 (concat package suffix))
286 suffixes))
287 packages))))
288 (paths-directories-which-exist directories)))
289
290 (defun paths-find-package-load-path (packages)
291 "Construct the load-path component for packages.
292 PACKAGES is a list of package directories."
293 (paths-find-recursive-load-path
294 (paths-find-package-library-path packages '("lisp/"))))
295
296 (defun paths-find-package-exec-path (packages)
297 (paths-find-package-library-path packages
298 (list (concat "bin/" system-configuration "/")
299 "lib-src/")))
300
301 (defun paths-find-package-info-path (packages)
302 (paths-find-package-library-path packages '("info/")))
303
304 (defun paths-find-package-data-path (packages)
305 (paths-find-package-library-path packages '("etc/")))
306
307 (defun paths-find-emacs-roots (invocation-directory
308 invocation-name)
309 "Find all plausible installation roots for XEmacs."
310 (let ((invocation-root
311 (paths-find-emacs-root invocation-directory invocation-name))
312 (installation-root
313 (if (and configure-prefix-directory
314 (file-directory-p configure-prefix-directory))
315 configure-prefix-directory)))
316 (append (and invocation-root
317 (list invocation-root))
318 (and installation-root
319 (list installation-root)))))
320
321 (defun paths-find-load-path (roots early-package-load-path late-package-load-path)
322 "Construct the load path." 56 "Construct the load path."
323 (let ((envvar-value (getenv "EMACSLOADPATH"))) 57 (let ((envvar-value (getenv "EMACSLOADPATH")))
324 (if (and (fboundp 'parse-colon-path) envvar-value) 58 (if envvar-value
325 (parse-colon-path envvar-value) 59 (decode-path-internal envvar-value)
326 (let* ((site-lisp-directory 60 (let* ((site-lisp-directory
327 (and allow-site-lisp 61 (and (null inhibit-site-lisp)
328 (paths-find-site-directory roots "site-lisp" 62 (paths-find-site-lisp-directory roots)))
329 nil
330 configure-site-directory)))
331 (site-lisp-load-path 63 (site-lisp-load-path
332 (and site-lisp-directory 64 (and site-lisp-directory
333 (paths-find-recursive-load-path (list site-lisp-directory)))) 65 (paths-find-recursive-load-path (list site-lisp-directory))))
334 (lisp-directory 66 (lisp-directory (paths-find-lisp-directory roots))
335 (paths-find-version-directory roots "lisp"
336 nil
337 configure-lisp-directory))
338 (lisp-load-path 67 (lisp-load-path
339 (paths-find-recursive-load-path (list lisp-directory)))) 68 (paths-find-recursive-load-path (list lisp-directory))))
340 (nconc early-package-load-path 69 (append early-package-load-path
341 site-lisp-load-path 70 site-lisp-load-path
342 late-package-load-path 71 late-package-load-path
343 lisp-load-path))))) 72 lisp-load-path)))))
344 73
345 (defun paths-find-info-path (roots early-packages late-packages) 74 (defun paths-construct-info-path (roots early-packages late-packages)
346 "Construct the info path." 75 "Construct the info path."
347 (append 76 (append
348 (paths-find-package-info-path early-packages) 77 (packages-find-package-info-path early-packages)
349 (paths-find-package-info-path late-packages) 78 (packages-find-package-info-path late-packages)
350 (let ((info-directory 79 (let ((info-directory
351 (paths-find-version-directory roots "info" 80 (paths-find-version-directory roots "info"
352 nil 81 nil
353 (append 82 (append
354 (and configure-info-directory 83 (and configure-info-directory
355 (list configure-info-directory)) 84 (list configure-info-directory))
356 configure-info-path)))) 85 configure-info-path))))
357 (and info-directory 86 (and info-directory
358 (list info-directory))) 87 (list info-directory)))
359 (let ((info-path-envval (getenv "INFOPATH"))) 88 (let ((info-path-envval (getenv "INFOPATH")))
360 (if (and (fboundp 'parse-colon-path) info-path-envval) 89 (if info-path-envval
361 (parse-colon-path info-path-envval))))) 90 (decode-path-internal info-path-envval)))))
362 91
363 (defun paths-find-doc-directory (roots) 92 (defun paths-find-doc-directory (roots)
364 "Find the documentation directory." 93 "Find the documentation directory."
365 (paths-find-architecture-directory roots "lib-src")) 94 (paths-find-architecture-directory roots "lib-src"))
366 95
381 110
382 (defun paths-find-exec-directory (roots) 111 (defun paths-find-exec-directory (roots)
383 "Find the binary directory." 112 "Find the binary directory."
384 (paths-find-architecture-directory roots "lib-src")) 113 (paths-find-architecture-directory roots "lib-src"))
385 114
386 (defun paths-find-exec-path (roots exec-directory early-packages late-packages) 115 (defun paths-construct-exec-path (roots exec-directory early-packages late-packages)
387 "Find the binary path." 116 "Find the binary path."
388 (append 117 (append
389 (let ((path-envval (getenv "PATH"))) 118 (let ((path-envval (getenv "PATH")))
390 (and (fboundp 'parse-colon-path) path-envval 119 (if path-envval
391 (parse-colon-path path-envval))) 120 (decode-path-internal path-envval)))
392 (paths-find-package-exec-path early-packages) 121 (packages-find-package-exec-path early-packages)
393 (paths-find-package-exec-path late-packages) 122 (packages-find-package-exec-path late-packages)
394 (let ((emacspath-envval (getenv "EMACSPATH"))) 123 (let ((emacspath-envval (getenv "EMACSPATH")))
395 (if (and (fboundp 'parse-colon-path) emacspath-envval) 124 (if emacspath-envval
396 (parse-colon-path path-envval) 125 (decode-path-internal emacspath-envval)
397 (paths-directories-which-exist configure-exec-path))) 126 (paths-directories-which-exist configure-exec-path)))
398 (and exec-directory 127 (and exec-directory
399 (list exec-directory)))) 128 (list exec-directory))))
400 129
401 (defun paths-find-data-directory (roots) 130 (defun paths-find-data-directory (roots)
402 "Find the data directory." 131 "Find the data directory."
403 (paths-find-version-directory roots "etc" "EMACSDATA" configure-data-directory)) 132 (paths-find-version-directory roots "etc" "EMACSDATA" configure-data-directory))
404 133
405 (defun paths-find-data-directory-list (data-directory early-packages late-packages) 134 (defun paths-construct-data-directory-list (data-directory early-packages late-packages)
406 "Find the data path." 135 "Find the data path."
407 (append 136 (append
408 (paths-find-package-data-path early-packages) 137 (packages-find-package-data-path early-packages)
409 (paths-find-package-data-path late-packages) 138 (packages-find-package-data-path late-packages)
410 (list data-directory))) 139 (list data-directory)))
411 140
412 (defun paths-setup-paths ()
413 "Setup all the various paths.
414 Call this as often as you like!"
415 ;; XEmacs -- Steven Baur says invocation directory is nil if you
416 ;; try to use XEmacs as a login shell.
417 (or invocation-directory (setq invocation-directory default-directory))
418 (if (fboundp 'abbreviate-file-name)
419 ;; No abbreviate-file-name in temacs
420 (setq invocation-directory
421 ;; don't let /tmp_mnt/... get into the load-path or exec-path.
422 (abbreviate-file-name invocation-directory)))
423
424 (let ((roots (paths-find-emacs-roots invocation-directory invocation-name)))
425
426 (setq package-path (paths-find-package-path roots))
427
428 (let ((stuff (paths-find-packages package-path)))
429 (setq early-packages (car stuff))
430 (setq late-packages (cdr stuff)))
431
432 (setq early-package-load-path (paths-find-package-load-path early-packages))
433 (setq late-package-load-path (paths-find-package-load-path late-packages))
434
435 (setq load-path (paths-find-load-path roots
436 early-package-load-path
437 late-package-load-path))
438
439 (setq info-path (paths-find-info-path roots early-packages late-packages))
440
441 (if (boundp 'lock-directory)
442 (progn
443 (setq lock-directory (paths-find-lock-directory roots))
444 (setq superlock-file (paths-find-superlock-file lock-directory))))
445
446 (setq exec-directory (paths-find-exec-directory roots))
447
448 (setq exec-path (paths-find-exec-path roots exec-directory
449 early-packages late-packages))
450
451 (setq doc-directory (paths-find-doc-directory roots))
452
453 (setq data-directory (paths-find-data-directory roots))
454
455 (setq data-directory-list (paths-find-data-directory-list data-directory
456 early-packages
457 late-packages))))
458
459 (defun paths-setup-paths-warning ()
460 (let ((lock (if (boundp 'lock-directory) lock-directory 't))
461 warnings message guess)
462 (if (and (stringp lock) (null (file-directory-p lock)))
463 (setq lock nil))
464 (cond
465 ((null (and exec-directory data-directory doc-directory load-path lock))
466 (save-excursion
467 (set-buffer (get-buffer-create " *warning-tmp*"))
468 (erase-buffer)
469 (buffer-disable-undo (current-buffer))
470 (if (null lock) (push "lock-directory" warnings))
471 (if (null exec-directory) (push "exec-directory" warnings))
472 (if (null data-directory) (push "data-directory" warnings))
473 (if (null doc-directory) (push "doc-directory" warnings))
474 (if (null load-path) (push "load-path" warnings))
475 (cond ((cdr (cdr warnings))
476 (setq message (apply 'format "%s, %s, and %s" warnings)))
477 ((cdr warnings)
478 (setq message (apply 'format "%s and %s" warnings)))
479 (t (setq message (format "variable %s" (car warnings)))))
480 (insert "couldn't find an obvious default for " message
481 ", and there were no defaults specified in paths.h when "
482 "XEmacs was built. Perhaps some directories don't exist, "
483 "or the XEmacs executable, " (concat invocation-directory
484 invocation-name)
485 " is in a strange place?")
486
487 (if (fboundp 'fill-region)
488 ;; Might not be bound in the cold load environment...
489 (let ((fill-column 76))
490 (fill-region (point-min) (point-max))))
491 (goto-char (point-min))
492 (princ "\nWARNING:\n" 'external-debugging-output)
493 (princ (buffer-string) 'external-debugging-output)
494 (erase-buffer)
495 t)))))
496
497 (defun paths-load-package-lisps (package-load-path base)
498 "Load all Lisp files of a certain name along a load path.
499 BASE is the base name of the files."
500 (mapc #'(lambda (dir)
501 (let ((file-name (expand-file-name base dir)))
502 (if (file-exists-p file-name)
503 (condition-case error
504 (load file-name)
505 (error
506 (warn (format "Autoload error in: %s:\n\t%s"
507 file-name
508 (with-output-to-string
509 (display-error error nil)))))))))
510 package-load-path))
511
512 (defun paths-load-package-auto-autoloads (package-load-path)
513 "Load auto-autoload files along a load path."
514 (paths-load-package-lisps package-load-path
515 (file-name-sans-extension autoload-file-name)))
516
517 (defun paths-load-package-dumped-lisps (package-load-path)
518 "Load dumped-lisp.el files along a load path."
519 (mapc #'(lambda (dir)
520 (let ((file-name (expand-file-name "dumped-lisp.el" dir)))
521 (if (file-exists-p file-name)
522 (let (package-lisp
523 ;; 20.4 packages could set this
524 preloaded-file-list)
525 (load file-name)
526 ;; dumped-lisp.el could have set this ...
527 (if package-lisp
528 (mapc #'(lambda (base)
529 (load (expand-file-name base dir)))
530 package-lisp))))))
531 package-load-path))
532
533 ;;; setup-paths.el ends here 141 ;;; setup-paths.el ends here