diff lisp/packages.el @ 209:41ff10fd062f r20-4b3

Import from CVS: tag r20-4b3
author cvs
date Mon, 13 Aug 2007 10:04:58 +0200
parents
children 78f53ef88e17
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lisp/packages.el	Mon Aug 13 10:04:58 2007 +0200
@@ -0,0 +1,251 @@
+;;; packages.el --- Low level support for XEmacs packages
+
+;; Copyright (C) 1997 Free Software Foundation, Inc.
+
+;; Author: Steven L Baur <steve@altair.xemacs.org>
+;; Keywords: internal, lisp, dumped
+
+;; This file is part of XEmacs.
+
+;; XEmacs is free software; you can redistribute it and/or modify it
+;; under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; XEmacs is distributed in the hope that it will be useful, but
+;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;; General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with XEmacs; see the file COPYING.  If not, write to the Free
+;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+;; 02111-1307, USA.
+
+;;; Synched up with: Not in FSF
+
+;;; Commentary:
+
+;; This file is dumped with XEmacs.
+
+;; This file provides low level facilities for XEmacs startup --
+;; particularly regarding the package setup.  This code has to run in
+;; what we call "bare temacs" -- i.e. XEmacs without the usual Lisp
+;; environment.  Pay special attention:
+
+;; - not to use the `lambda' macro.  Use #'(lambda ...) instead.
+;;   (this goes for any package loaded before `subr.el'.)
+;;
+;; - not to use macros, because they are not yet available (and this
+;;   file must be loadable uncompiled.)  This rules out CL-style
+;;   macros like `when', for instance.
+;;
+;; - not to use `defcustom'.  If you must add user-customizable
+;;   variables here, use `defvar', and add the variable to
+;;   `cus-start.el'.
+
+;; Because of all this, make sure that the stuff you put here really
+;; belongs here.
+
+
+;;; Code:
+
+(defvar autoload-file-name "auto-autoloads.el"
+  "Filename that autoloads are expected to be found in.")
+
+(defvar packages-hardcoded-lisp
+  '(
+    ;; "startup"
+    )
+  "Lisp packages that are always dumped with XEmacs")
+
+(defvar packages-useful-lisp
+  '("bytecomp"
+    "byte-optimize"
+    "advice"
+    "shadow"
+    "cl-macs")
+  "Lisp packages that need early byte compilation.")
+
+(defvar packages-unbytecompiled-lisp
+  '("paths.el"
+    "version.el")
+  "Lisp packages that should not be byte compiled.")
+
+
+;; Copied from help.el, could possibly move it to here permanently.
+;; Unlike the FSF version, our `locate-library' uses the `locate-file'
+;; primitive, which should make it lightning-fast.
+
+(defun locate-library (library &optional nosuffix path interactive-call)
+  "Show the precise file name of Emacs library LIBRARY.
+This command searches the directories in `load-path' like `M-x load-library'
+to find the file that `M-x load-library RET LIBRARY RET' would load.
+Optional second arg NOSUFFIX non-nil means don't add suffixes `.elc' or `.el'
+to the specified name LIBRARY.
+
+If the optional third arg PATH is specified, that list of directories
+is used instead of `load-path'."
+  (interactive (list (read-string "Locate library: ")
+                     nil nil
+                     t))
+  (let ((result
+	 (locate-file
+	  library
+	  (or path load-path)
+	  (cond ((or (rassq 'jka-compr-handler file-name-handler-alist)
+		     (and (boundp 'find-file-hooks)
+			  (member 'crypt-find-file-hook find-file-hooks)))
+		 ;; Compression involved.
+		 (if nosuffix
+		     ":.gz:.Z"
+		   ".elc:.elc.gz:elc.Z:.el:.el.gz:.el.Z::.gz:.Z"))
+		(t
+		 ;; No compression.
+		 (if nosuffix
+		     ""
+		   ".elc:.el:")))
+	  4)))
+    (and interactive-call
+	 (if result
+	     (message "Library is file %s" result)
+	   (message "No library %s in search path" library)))
+    result))
+
+(defun packages-add-suffix (str)
+  (if (null (string-match "\\.el\\'" str))
+      (concat str ".elc")
+    str))
+
+(defun list-autoloads-path ()
+  "List autoloads from precomputed load-path."
+  (let ((path load-path)
+	autoloads)
+    (while path
+      (if (file-exists-p (concat (car path)
+				 autoload-file-name))
+	  (setq autoloads (cons (concat (car path)
+					autoload-file-name)
+				autoloads)))
+      (setq path (cdr path)))
+    autoloads))
+
+(defun list-autoloads ()
+  "List autoload files in (what will be) the normal lisp search path.
+This function is used during build to find where the global symbol files so
+they can be perused for their useful information."
+  ;; Source directory may not be initialized yet.
+  ;; (print (prin1-to-string load-path))
+  (if (null source-directory)
+      (setq source-directory (concat (car load-path) "/..")))
+  (let ((files (directory-files source-directory t ".*"))
+	file autolist)
+    (while (setq file (car-safe files))
+      (if (and (file-directory-p file)
+	       (file-exists-p (concat file "/" autoload-file-name)))
+	  (setq autolist (cons (concat file "/" autoload-file-name)
+			       autolist)))
+      (setq files (cdr files)))
+    autolist))
+
+;; The following function is called from temacs
+(defun packages-find-packages-1 (package path-only user-package)
+  "Search the supplied directory for associated directories.
+The top level is assumed to look like:
+info/           Contain texinfo files for lisp installed in this hierarchy
+etc/            Contain data files for lisp installled in this hiearchy
+lisp/           Contain directories which either have straight lisp code
+                or are self-contained packages of their own.
+
+This is an internal function.  Do not call it after startup."
+  ;; Info files
+  (if (and (null path-only) (file-directory-p (concat package "/info")))
+      (let ((dir (concat package "/info/")))
+	(if (not (member dir Info-default-directory-list))
+	    (nconc Info-default-directory-list (list dir)))))
+  ;; Data files
+  (if (and (null path-only) (file-directory-p (concat package "/etc")))
+      (setq data-directory-list
+	    (cons (concat package "/etc/") data-directory-list)))
+  ;; Lisp files
+  (if (file-directory-p (concat package "/lisp"))
+      (progn
+;	(print (concat "DIR: "
+;		       (if user-package "[USER]" "")
+;		       package
+;		       "/lisp/"))
+	(setq load-path (cons (concat package "/lisp/") load-path))
+	(if user-package
+	    (condition-case nil
+		(load (concat package "/lisp/"
+			      (file-name-sans-extension autoload-file-name)))
+	      (t nil)))
+	(let ((dirs (directory-files (concat package "/lisp/")
+				     t "^[^-.]" nil 'dirs-only))
+	      dir)
+	  (while dirs
+	    (setq dir (car dirs))
+;	    (print (concat "DIR: " dir "/"))
+	    (setq load-path (cons (concat dir "/") load-path))
+	    (if user-package
+		(condition-case nil
+		    (progn
+;		      (print
+;		       (concat dir "/"
+;			       (file-name-sans-extension autoload-file-name)))
+		      (load
+		       (concat dir "/"
+			       (file-name-sans-extension autoload-file-name))))
+		  (t nil)))
+	    (packages-find-packages-1 dir path-only user-package)
+	    (setq dirs (cdr dirs)))))))
+
+;; The following function is called from temacs
+(defun packages-find-packages (pkg-path path-only &optional suppress-user)
+  "Search the supplied path for additional info/etc/lisp directories.
+Lisp directories if configured prior to build time will have equivalent
+status as bundled packages.
+If the argument `path-only' is non-nil, only the `load-path' will be set,
+otherwise data directories and info directories will be added.
+If the optional argument `suppress-user' is non-nil, package directories
+rooted in a user login directory (like ~/.xemacs) will not be searched.
+This is used at dump time to suppress the builder's local environment."
+  (let ((path (reverse pkg-path))
+	dir)
+    (while path
+      (setq dir (car path))
+      ;; (prin1 (concat "Find: " (expand-file-name dir) "\n"))
+      (if (null (and (or suppress-user inhibit-package-init)
+		     (string-match "^~" dir)))
+	  (progn
+	    ;; (print dir)
+	    (packages-find-packages-1 (expand-file-name dir)
+				      path-only
+				      (string-match "^~" dir))))
+      (setq path (cdr path)))))
+
+;; Data-directory is really a list now.  Provide something to search it for
+;; directories.
+
+(defun locate-data-directory (name &optional dir-list)
+  "Locate a directory in a search path DIR-LIST (a list of directories).
+If no DIR-LIST is supplied, it defaults to `data-directory-list'."
+  (unless dir-list
+    (setq dir-list data-directory-list))
+  (let (found found-dir)
+    (while (and (null found-dir) dir-list)
+      (setq found (concat (car dir-list) name "/")
+	    found-dir (file-directory-p found))
+      (or found-dir
+	  (setq found nil))
+      (setq dir-list (cdr dir-list)))
+    found))
+
+;; If we are being loaded as part of being dumped, bootstrap the rest of the
+;; load-path for loaddefs.
+(if (fboundp 'load-gc)
+    (packages-find-packages package-path t t))
+
+(provide 'packages)
+
+;;; packages.el ends here