Mercurial > hg > xemacs-beta
diff 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 |
line wrap: on
line diff
--- a/lisp/setup-paths.el Mon Aug 13 10:25:39 2007 +0200 +++ b/lisp/setup-paths.el Mon Aug 13 10:26:29 2007 +0200 @@ -31,322 +31,51 @@ ;; This file is dumped with XEmacs. -;; This file contains the machinery necessary to find the various -;; paths into the XEmacs hierarchy. - -(defvar paths-version-control-bases '("RCS" "CVS" "SCCS") - "File bases associated with version control.") - -(defun paths-find-recursive-path (directories &optional exclude) - "Return a list of the directory hierarchy underneath DIRECTORIES. -The returned list is sorted by pre-order and lexicographically." - (let ((path '())) - (while directories - (let ((directory (file-name-as-directory - (expand-file-name - (car directories))))) - (if (file-directory-p directory) - (let ((raw-dirs (directory-files directory nil "^[^-.]" nil 'dirs-only)) - (reverse-dirs '())) - - (while raw-dirs - (if (null (member (car raw-dirs) exclude)) - (setq reverse-dirs - (cons (expand-file-name (car raw-dirs) directory) - reverse-dirs))) - (setq raw-dirs (cdr raw-dirs))) - - (let ((sub-path - (paths-find-recursive-path (reverse reverse-dirs) exclude))) - (setq path (nconc path - (list directory) - sub-path)))))) - (setq directories (cdr directories))) - path)) - -(defun paths-find-recursive-load-path (directories) - "Construct a recursive load path underneath DIRECTORIES." - (paths-find-recursive-path directories paths-version-control-bases)) - -(defun paths-emacs-root-p (directory) - "Check if DIRECTORY is a plausible installation root for XEmacs." - (or - ;; installed - (and (boundp 'emacs-version) - (file-directory-p - (concat directory "lib/xemacs-" (construct-emacs-version)))) - ;; in-place - (and - (file-directory-p (concat directory "lib-src")) - (file-directory-p (concat directory "lisp")) - (file-directory-p (concat directory "src"))))) +;; This file describes and constructs the various paths into the +;; XEmacs hierarchy from a global viewpoint. -(defun paths-find-emacs-root - (invocation-directory invocation-name) - "Find the run-time root of XEmacs." - (let ((maybe-root-1 (file-name-as-directory - (expand-file-name ".." invocation-directory))) - (maybe-root-2 (file-name-as-directory - (expand-file-name "../.." invocation-directory)))) - (cond - ((paths-emacs-root-p maybe-root-1) - maybe-root-1) - ((paths-emacs-root-p maybe-root-2) - maybe-root-2) - (t - (let ((maybe-symlink (file-symlink-p (concat invocation-directory - invocation-name)))) - (if maybe-symlink - (let ((directory (file-name-directory maybe-symlink))) - (paths-find-emacs-root directory invocation-name)) - nil)))))) - -(defun paths-construct-emacs-directory (root suffix base) - "Construct a directory name within the XEmacs hierarchy." - (file-name-as-directory - (expand-file-name - (concat - (file-name-as-directory root) - suffix - base)))) - -(defun paths-find-emacs-directory (roots suffix base &optional envvar default) - "Find a directory in the XEmacs hierarchy. -ROOTS must be a list of installation roots. -SUFFIX is the subdirectory from there. -BASE is the base to look for. -ENVVAR is the name of the environment variable that might also -specify the directory. -DEFAULT is a fall-back value." - (let ((envvar-value (and envvar (getenv envvar)))) - (if (and envvar-value - (file-directory-p envvar-value)) - (file-name-as-directory envvar-value) - (catch 'gotcha - (while roots - (let* ((root (car roots)) - (path (paths-construct-emacs-directory root suffix base))) - ;; installed - (if (file-directory-p path) - (throw 'gotcha path) - (let ((path (paths-construct-emacs-directory root "" base))) - ;; in-place - (if (file-directory-p path) - (throw 'gotcha path))))) - (setq roots (cdr roots))) - (if (and default - (file-directory-p default)) - (file-name-as-directory default) - nil))))) - -(defun paths-find-site-directory (roots base &optional envvar default) - "Find a site-specific directory in the XEmacs hierarchy." - (paths-find-emacs-directory roots "lib/xemacs/" base envvar default)) - -(defun paths-find-version-directory (roots base &optional envvar default) - "Find a version-specific directory in the XEmacs hierarchy." - (paths-find-emacs-directory roots - (concat "lib/xemacs-" (construct-emacs-version) "/") - base - envvar default)) - -(defun paths-find-architecture-directory (roots base &optional envvar default) - "Find an architecture-specific directory in the XEmacs hierarchy." - (or - ;; from more to less specific - (paths-find-version-directory roots - (concat base system-configuration) - envvar default) - (paths-find-version-directory roots - system-configuration - envvar default) - (paths-find-version-directory roots - base - envvar default))) - -(defvar paths-path-emacs-version nil - "Emacs version as it appears in paths.") +;; It requires find-paths.el and packages.el. + +;;; Code: -(defun construct-emacs-version () - "Construct the raw version number of XEmacs in the form XX.XX." - ;; emacs-version isn't available early, but we really don't care then - (if (null (boundp 'emacs-version)) - "" - (or paths-path-emacs-version ; cache - (progn - (string-match "\\`[^0-9]*\\([0-9]+\\.[0-9]+\\)" emacs-version) - (let ((version (substring emacs-version - (match-beginning 1) (match-end 1)))) - (if (string-match "(beta *\\([0-9]+\\))" emacs-version) - (setq version (concat version - "-b" - (substring emacs-version - (match-beginning 1) (match-end 1))))) - (setq paths-path-emacs-version version) - version))))) - -(defun paths-find-emacs-path (roots suffix base &optional envvar default) - "Find a path in the XEmacs hierarchy. -ROOTS must be a list of installation roots. -SUFFIX is the subdirectory from there. -BASE is the base to look for. -ENVVAR is the name of the environment variable that might also -specify the path. -DEFAULT is a fall-back value." - (let ((envvar-value (and envvar (getenv envvar)))) - (if (and (fboundp 'parse-colon-path) envvar-value) - (parse-colon-path envvar-value) - (let ((directory (paths-find-emacs-directory roots base suffix))) - (if (and directory (file-directory-p directory)) - (list directory) - (paths-directories-which-exist default)))))) - -(defun paths-directories-which-exist (directories) - "Return the directories among DIRECTORIES." - (let ((reverse-directories '())) - (while directories - (if (file-directory-p (car directories)) - (setq reverse-directories - (cons (car directories) - reverse-directories))) - (setq directories (cdr directories))) - (reverse reverse-directories))) - -(defun paths-find-site-path (roots base &optional envvar default) - "Find a path underneath the site hierarchy." - (paths-find-emacs-path roots "lib/xemacs/" base envvar default)) - -(defun paths-find-version-path (roots base &optional envvar default) - "Find a path underneath the site hierarchy." - (paths-find-emacs-path roots - (concat "lib/xemacs-" (construct-emacs-version) "/") - base - envvar default)) - -; Packages are special ... - -(defun paths-find-package-path (roots) - "Construct the package path underneath installation roots ROOTS." - (let ((envvar-value (getenv "EMACSPACKAGEPATH"))) - (if (and (fboundp 'parse-colon-path) envvar-value) - (parse-colon-path envvar-value) - (let ((base-directory (paths-find-site-directory roots "packages"))) - (if base-directory - (let ((mule-directory (and (featurep 'mule) - (paths-find-site-directory roots - "mule-packages")))) - (append '("~/.xemacs/") - '(nil) - (and mule-directory - (list mule-directory)) - (list base-directory))) - configure-package-path))))) +(defun paths-find-site-lisp-directory (roots) + "Find the site Lisp directory of the XEmacs hierarchy." + (paths-find-site-directory roots "site-lisp" + nil + configure-site-directory)) -(defvar paths-package-special-bases '("etc" "info" "lisp" "lib-src" "bin") - "Special subdirectories of packages.") - -(defun paths-find-packages-in-directories (directories) - "Find all packages underneath directories in DIRECTORIES." - (paths-find-recursive-path directories - (append paths-version-control-bases - paths-package-special-bases))) - -(defun paths-split-path (path) - "Split PATH at NIL, return pair with two components. -The second component is shared with PATH." - (let ((reverse-early '())) - (while (and path (null (null (car path)))) - (setq reverse-early (cons (car path) reverse-early)) - (setq path (cdr path))) - (if (null path) - (cons nil path) - (cons (reverse reverse-early) (cdr path))))) - -(defun paths-find-packages (package-path) - "Search for all packages in PACKAGE-PATH. -PACKAGE-PATH may distinguish (by NIL-separation) between early -and late packages. -This returns (CONS EARLY-PACKAGES LATE-PACKAGES)." - (let* ((stuff (paths-split-path package-path)) - (early (car stuff)) - (late (cdr stuff))) - (cons (paths-find-packages-in-directories early) - (paths-find-packages-in-directories late)))) +(defun paths-find-lisp-directory (roots) + "Find the main Lisp directory of the XEmacs hierarchy." + (paths-find-version-directory roots "lisp" + nil + configure-lisp-directory)) -(defun paths-find-package-library-path (packages suffixes) - "Construct a path into a component of the packages hierarchy. -PACKAGES is a list of package directories. -SUFFIXES is a list of names of package subdirectories to look for." - (let ((directories - (apply - #'append - (mapcar #'(lambda (package) - (mapcar #'(lambda (suffix) - (concat package suffix)) - suffixes)) - packages)))) - (paths-directories-which-exist directories))) - -(defun paths-find-package-load-path (packages) - "Construct the load-path component for packages. -PACKAGES is a list of package directories." - (paths-find-recursive-load-path - (paths-find-package-library-path packages '("lisp/")))) - -(defun paths-find-package-exec-path (packages) - (paths-find-package-library-path packages - (list (concat "bin/" system-configuration "/") - "lib-src/"))) - -(defun paths-find-package-info-path (packages) - (paths-find-package-library-path packages '("info/"))) - -(defun paths-find-package-data-path (packages) - (paths-find-package-library-path packages '("etc/"))) - -(defun paths-find-emacs-roots (invocation-directory - invocation-name) - "Find all plausible installation roots for XEmacs." - (let ((invocation-root - (paths-find-emacs-root invocation-directory invocation-name)) - (installation-root - (if (and configure-prefix-directory - (file-directory-p configure-prefix-directory)) - configure-prefix-directory))) - (append (and invocation-root - (list invocation-root)) - (and installation-root - (list installation-root))))) - -(defun paths-find-load-path (roots early-package-load-path late-package-load-path) +(defun paths-construct-load-path + (roots early-package-load-path late-package-load-path + &optional inhibit-site-lisp) "Construct the load path." (let ((envvar-value (getenv "EMACSLOADPATH"))) - (if (and (fboundp 'parse-colon-path) envvar-value) - (parse-colon-path envvar-value) + (if envvar-value + (decode-path-internal envvar-value) (let* ((site-lisp-directory - (and allow-site-lisp - (paths-find-site-directory roots "site-lisp" - nil - configure-site-directory))) + (and (null inhibit-site-lisp) + (paths-find-site-lisp-directory roots))) (site-lisp-load-path (and site-lisp-directory (paths-find-recursive-load-path (list site-lisp-directory)))) - (lisp-directory - (paths-find-version-directory roots "lisp" - nil - configure-lisp-directory)) + (lisp-directory (paths-find-lisp-directory roots)) (lisp-load-path (paths-find-recursive-load-path (list lisp-directory)))) - (nconc early-package-load-path - site-lisp-load-path - late-package-load-path - lisp-load-path))))) + (append early-package-load-path + site-lisp-load-path + late-package-load-path + lisp-load-path))))) -(defun paths-find-info-path (roots early-packages late-packages) +(defun paths-construct-info-path (roots early-packages late-packages) "Construct the info path." (append - (paths-find-package-info-path early-packages) - (paths-find-package-info-path late-packages) + (packages-find-package-info-path early-packages) + (packages-find-package-info-path late-packages) (let ((info-directory (paths-find-version-directory roots "info" nil @@ -357,8 +86,8 @@ (and info-directory (list info-directory))) (let ((info-path-envval (getenv "INFOPATH"))) - (if (and (fboundp 'parse-colon-path) info-path-envval) - (parse-colon-path info-path-envval))))) + (if info-path-envval + (decode-path-internal info-path-envval))))) (defun paths-find-doc-directory (roots) "Find the documentation directory." @@ -383,17 +112,17 @@ "Find the binary directory." (paths-find-architecture-directory roots "lib-src")) -(defun paths-find-exec-path (roots exec-directory early-packages late-packages) +(defun paths-construct-exec-path (roots exec-directory early-packages late-packages) "Find the binary path." (append (let ((path-envval (getenv "PATH"))) - (and (fboundp 'parse-colon-path) path-envval - (parse-colon-path path-envval))) - (paths-find-package-exec-path early-packages) - (paths-find-package-exec-path late-packages) + (if path-envval + (decode-path-internal path-envval))) + (packages-find-package-exec-path early-packages) + (packages-find-package-exec-path late-packages) (let ((emacspath-envval (getenv "EMACSPATH"))) - (if (and (fboundp 'parse-colon-path) emacspath-envval) - (parse-colon-path path-envval) + (if emacspath-envval + (decode-path-internal emacspath-envval) (paths-directories-which-exist configure-exec-path))) (and exec-directory (list exec-directory)))) @@ -402,132 +131,11 @@ "Find the data directory." (paths-find-version-directory roots "etc" "EMACSDATA" configure-data-directory)) -(defun paths-find-data-directory-list (data-directory early-packages late-packages) +(defun paths-construct-data-directory-list (data-directory early-packages late-packages) "Find the data path." (append - (paths-find-package-data-path early-packages) - (paths-find-package-data-path late-packages) + (packages-find-package-data-path early-packages) + (packages-find-package-data-path late-packages) (list data-directory))) -(defun paths-setup-paths () - "Setup all the various paths. -Call this as often as you like!" - ;; XEmacs -- Steven Baur says invocation directory is nil if you - ;; try to use XEmacs as a login shell. - (or invocation-directory (setq invocation-directory default-directory)) - (if (fboundp 'abbreviate-file-name) - ;; No abbreviate-file-name in temacs - (setq invocation-directory - ;; don't let /tmp_mnt/... get into the load-path or exec-path. - (abbreviate-file-name invocation-directory))) - - (let ((roots (paths-find-emacs-roots invocation-directory invocation-name))) - - (setq package-path (paths-find-package-path roots)) - - (let ((stuff (paths-find-packages package-path))) - (setq early-packages (car stuff)) - (setq late-packages (cdr stuff))) - - (setq early-package-load-path (paths-find-package-load-path early-packages)) - (setq late-package-load-path (paths-find-package-load-path late-packages)) - - (setq load-path (paths-find-load-path roots - early-package-load-path - late-package-load-path)) - - (setq info-path (paths-find-info-path roots early-packages late-packages)) - - (if (boundp 'lock-directory) - (progn - (setq lock-directory (paths-find-lock-directory roots)) - (setq superlock-file (paths-find-superlock-file lock-directory)))) - - (setq exec-directory (paths-find-exec-directory roots)) - - (setq exec-path (paths-find-exec-path roots exec-directory - early-packages late-packages)) - - (setq doc-directory (paths-find-doc-directory roots)) - - (setq data-directory (paths-find-data-directory roots)) - - (setq data-directory-list (paths-find-data-directory-list data-directory - early-packages - late-packages)))) - -(defun paths-setup-paths-warning () - (let ((lock (if (boundp 'lock-directory) lock-directory 't)) - warnings message guess) - (if (and (stringp lock) (null (file-directory-p lock))) - (setq lock nil)) - (cond - ((null (and exec-directory data-directory doc-directory load-path lock)) - (save-excursion - (set-buffer (get-buffer-create " *warning-tmp*")) - (erase-buffer) - (buffer-disable-undo (current-buffer)) - (if (null lock) (push "lock-directory" warnings)) - (if (null exec-directory) (push "exec-directory" warnings)) - (if (null data-directory) (push "data-directory" warnings)) - (if (null doc-directory) (push "doc-directory" warnings)) - (if (null load-path) (push "load-path" warnings)) - (cond ((cdr (cdr warnings)) - (setq message (apply 'format "%s, %s, and %s" warnings))) - ((cdr warnings) - (setq message (apply 'format "%s and %s" warnings))) - (t (setq message (format "variable %s" (car warnings))))) - (insert "couldn't find an obvious default for " message - ", and there were no defaults specified in paths.h when " - "XEmacs was built. Perhaps some directories don't exist, " - "or the XEmacs executable, " (concat invocation-directory - invocation-name) - " is in a strange place?") - - (if (fboundp 'fill-region) - ;; Might not be bound in the cold load environment... - (let ((fill-column 76)) - (fill-region (point-min) (point-max)))) - (goto-char (point-min)) - (princ "\nWARNING:\n" 'external-debugging-output) - (princ (buffer-string) 'external-debugging-output) - (erase-buffer) - t))))) - -(defun paths-load-package-lisps (package-load-path base) - "Load all Lisp files of a certain name along a load path. -BASE is the base name of the files." - (mapc #'(lambda (dir) - (let ((file-name (expand-file-name base dir))) - (if (file-exists-p file-name) - (condition-case error - (load file-name) - (error - (warn (format "Autoload error in: %s:\n\t%s" - file-name - (with-output-to-string - (display-error error nil))))))))) - package-load-path)) - -(defun paths-load-package-auto-autoloads (package-load-path) - "Load auto-autoload files along a load path." - (paths-load-package-lisps package-load-path - (file-name-sans-extension autoload-file-name))) - -(defun paths-load-package-dumped-lisps (package-load-path) - "Load dumped-lisp.el files along a load path." - (mapc #'(lambda (dir) - (let ((file-name (expand-file-name "dumped-lisp.el" dir))) - (if (file-exists-p file-name) - (let (package-lisp - ;; 20.4 packages could set this - preloaded-file-list) - (load file-name) - ;; dumped-lisp.el could have set this ... - (if package-lisp - (mapc #'(lambda (base) - (load (expand-file-name base dir))) - package-lisp)))))) - package-load-path)) - ;;; setup-paths.el ends here