Mercurial > hg > xemacs-beta
changeset 1232:c08a6fa181d1
[xemacs-hg @ 2003-01-23 11:38:56 by stephent]
commit notice <87lm1cksms.fsf@tleepslib.sk.tsukuba.ac.jp>
autoloads patch <87lm1ig654.fsf@tleepslib.sk.tsukuba.ac.jp>
Martin's info.el patch <877kd5je7e.fsf@tleepslib.sk.tsukuba.ac.jp>
author | stephent |
---|---|
date | Thu, 23 Jan 2003 11:39:01 +0000 |
parents | 3f6adebda25c |
children | fd0a681706eb |
files | ChangeLog Makefile.in.in lisp/ChangeLog lisp/autoload.el lisp/info.el lisp/startup.el lisp/update-elc-2.el lisp/update-elc.el |
diffstat | 8 files changed, 496 insertions(+), 220 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog Thu Jan 23 11:24:13 2003 +0000 +++ b/ChangeLog Thu Jan 23 11:39:01 2003 +0000 @@ -1,3 +1,8 @@ +2002-10-19 Stephen Turnbull <stephen@xemacs.org> + + * Makefile.in.in (clean): Delete auto-autoloads.e* and custom-load.* + in lisp, lisp/mule, and modules. + 2003-01-14 Jerry James <james@xemacs.org> * PROBLEMS: Describe Steve Youngs' problem with the PostgreSQL
--- a/Makefile.in.in Thu Jan 23 11:24:13 2003 +0000 +++ b/Makefile.in.in Thu Jan 23 11:39:01 2003 +0000 @@ -555,9 +555,16 @@ ## with them. ## Delete `.dvi' files here if they are not part of the distribution. + +## Remove the generated load files here; they cause lots of problems +## when they don't work right. (beta can't depend on distclean, which +## removes necessary files generated by configure.) clean: FRC.clean for d in $(SUBDIR); do (cd ./$$d && $(RECURSIVE_MAKE) $@); done - $(RM) core + $(RM) core lisp/auto-autoloads.el* lisp/custom-load.el* + $(RM) lisp/mule/auto-autoloads.el* lisp/mule/custom-load.el* + $(RM) ${srcdir}/modules/auto-autoloads.el* + $(RM) ${srcdir}/modules/custom-load.el* ## `distclean' ## Delete all files from the current directory that are created by
--- a/lisp/ChangeLog Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/ChangeLog Thu Jan 23 11:39:01 2003 +0000 @@ -1,3 +1,62 @@ +2003-01-18 Stephen J. Turnbull <stephen@xemacs.org> + + * autoload.el: Drastically reorganized. + + API improvement: + + (autoload-target-directory): + (batch-update-autoloads): + (batch-update-directory): + (batch-update-one-directory): + (batch-force-update-one-directory): + Deprecated. + (autoload-feature-prefix): New special. + (autoload-package-name): Obsolete alias for autoload-feature-prefix. + (autoload-batch-update-autoloads): New function. Main + command-line API. + + Documentation: + + Improve many docstrings. + (Header summary): Update. + (Commentary): Completely rewritten. + (ChangeLog): Redundant, so removed. + + General sanitation: + + (generated-autoload-file): Default changed to lisp-directory. + (generate-file-autoloads): Better argument checking. + (generate-c-file-autoloads-1): Make the output code prettier, + clean up long lines. + (autoload-featurep-protect-autoloads): + (autoload-make-feature-name): + New functions for handling feature checking and provide'ing. + (update-autoload-files): Use them. Don't try tricky things to + guess feature names. + (update-autoloads-here): Remove extra arg to a call + to format. Warn of probable bitrot in the docstring. + (batch-force-update-one-directory): + (batch-update-one-directory): + Fix typo in error message. + + Related changes: + + * update-elc.el: Use `autoload-update-directory-autoloads'. + + * update-elc-2.el (batch-update-elc-2): Use full API for + `update-autoload-files'. + + * startup.el (startup-load-autoloads): Oops. Ben generates Mule + autoloads in lisp/mule, Mike doesn't load them in startup.el. + Also, use `when' and `unless' for clarity. + (command-line): Comment typo. + (splash-frame-body): Grammatical nits. + +2003-01-17 Stephen J. Turnbull <stephen@xemacs.org> + + * info.el (Info-insert-dir): Make default-directory end in + separator. Patch due to Martin Buchholz. + 2003-01-10 Mike Sperber <mike@xemacs.org> * window-xemacs.el: Revert his change
--- a/lisp/autoload.el Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/autoload.el Thu Jan 23 11:39:01 2003 +0000 @@ -1,4 +1,4 @@ -;;; autoload.el --- maintain autoloads in loaddefs.el. +;;; autoload.el --- maintain autoloads in auto-autoloads files. ;; Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. ;; Copyright (C) 1995 Tinker Systems and INS Engineering Corp. @@ -28,19 +28,194 @@ ;;; Commentary: -;; This code helps XEmacs maintainers keep the loaddefs.el file up to -;; date. It interprets magic cookies of the form ";;;###autoload" in -;; lisp source files in various useful ways. To learn more, read the -;; source; if you're going to use this, you'd better be able to. +;; This code keeps auto-autoloads.el files up to date. It interprets +;; magic cookies (of the form ";;;###autoload" in Lisp source files +;; and "/* ###autoload */" in C source files) in various useful ways. + +;; Usage +;; ===== + +;; Recommended usage for this library, as implemented in the core +;; build process, is + +;; xemacs -no-packages -batch \ +;; -eval "(setq generated-autoload-file \"PATH\")" \ +;; -l autoload -f autoload-update-directory-autoloads PREFIX DIRECTORY + +;; which causes XEmacs to update the file named by PATH from the .el +;; files in DIRECTORY (but not recursing into subdirectories) and (if +;; the autoload file is not already protected with a feature test) add +;; a check and provide for 'PREFIX-autoloads. Currently there is no +;; sanity check for the provided feature; it is recommended that you +;; nuke any existing auto-autoloads.el before running the command. + +;; There is not yet a recommended API for updating multiple directories +;; into a single auto-autoloads file. Using the recipe above for each +;; DIRECTORY with the same PATH should work but has not been tested. +;; There is no API for recursing into subdirectories. There probably +;; won't be; given the wide variety of ways that existing Lisp packages +;; arrange their files, and the fact that source packages and installed +;; packages have a somewhat different directory structure, this seems far +;; too risky. Use a script or a Lisp library with an explicit list of +;; PATHs; see update-elc.el for how to do this without recursive invocation +;; of XEmacs). + +;; The probable next step is to fix up the packages to use the +;; `autoload-update-directory-autoloads' API. However, for backward +;; compatibility with XEmacs 21.4 and 21.1, this can't be done quickly. + +;; For now the API used in update-elc-2.el: + +;; (let* ((dir "DIRECTORY") +;; (generated-autoload-file (expand-file-name "auto-autoloads.el" dir)) +;; (autoload-package-name "PREFIX")) +;; (update-autoload-files (list muledir)) +;; (byte-recompile-file generated-autoload-file 0)) + +;; is available, but this ugly kludge is deprecated. It will be removed +;; in favor of using proper arguments instead of special variables. + +;; For backward compatibility the API used in the packages/XEmacs.rules: + +;; xemacs -vanilla -batch -eval "$(AUTOLOAD_PACKAGE_NAME)" \ +;; -l autoload -f batch-update-directory $(AUTOLOAD_PATH) + +;; is supported, and the implementation is unchanged. However, +;; revision of the API (in a backward compatible way) and the +;; implementation are planned, and until those stabilize it is too +;; risky to use this version of XEmacs for package releases. + +;; Implementation: +;; =============== + +;; #### This section should be moved to the Internals manual, or +;; (maybe) the Lispref, and integrated with the information above. +;; Don't believe anything written here; the code is still a mess, and +;; this is a lot of guesswork. + +;; Autoloads are used in a number of contexts, including core Lisp, +;; packaged Lisp, and ELLs (dynamically loadable compiled objects +;; providing Lisp functionality). There two general strategies for +;; collecting autoloads. The first is to put autoloads for a package +;; in a package-specific auto-autoloads file. This is easy to +;; implement, and allows packages to be distributed with prebuilt +;; auto-autoloads files. The second is to collect all the autoloads +;; in a single global auto-autoloads file. This is alleged to speed +;; up initialization significantly, but requires care to ensure that +;; auto-autoloads files remain synchronized with the libraries. + +;; The traditional logic for determining where to put autoload +;; definitions is complex and is now deprecated. The special variable +;; `generated-autoload-file' is used to hold the path to the file, and +;; is initialized to the traditional (well, it's a new tradition with +;; XEmacs 20) $blddir/lisp/auto-autoloads.el. However, this variable +;; may be bound by calling code, or may be generated at collect time +;; and I'm not even sure the initialized value was ever used any more. + +;; Because there may be multiple auto-autoloads files in use (in XEmacs +;; 21.x with a full complement of packages there are dozens), and they may +;; contain initializations that would be dangerous to reexecute, each is +;; protected by a feature test. By convention, the feature symbol is of +;; the form "NAME-autoloads". For packages, the special variable +;; `autoload-package-name' is used to determine NAME. In the core, +;; autoloads are defined in the modules (all of which are collected in a +;; single auto-autoloads file), using NAME=modules, in the lisp directory +;; using NAME=lisp, and in the lisp/mule directory, using NAME=mule, for +;; the autoloads feature. These latter are computed by the autoloads +;; function at collect time. ;; ChangeLog: -;; Jun-25-2002: Jerry James added code for processing C files, to -;; support modularization -;; Sep-26-1997: slb removed code dealing with customization. +;; See ./ChangeLog. ;;; Code: +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Standard file and directory names + +;; `autoload-file-name' is defvar'd and initialized in packages.el, +;; which is loaded (and dumped) very early. If you find it isn't, you +;; know what you're doing. + +(defconst autoload-target-directory "../lisp/" + "Standard directory containing autoload declaration file. + +Use `generated-autoload-file' (q.v.) to change its installation location.") + +;; Dynamic variables for communication among functions + +(defvar generated-autoload-file + (expand-file-name autoload-file-name lisp-directory) + "*File `update-file-autoloads' puts autoloads into. +A .el file can set this in its local variables section to make its +autoloads go somewhere else. + +Note that `batch-update-directory' binds this variable to its own value, +generally the file named by `autoload-file-name' in the directory being +updated. XEmacs.rules setq's this variable for package autoloads.") + +(define-obsolete-variable-alias 'autoload-package-name + 'autoload-feature-prefix) +(defvar autoload-feature-prefix nil + "If non-nil, use this string to prefix the autoload feature name. + +Usually a package name (from AUTOLOAD_PACKAGE_NAME, defined in XEmacs.rules +in the top of the package hierarchy), or \"auto\" (reserved for the core Lisp +auto-autoloads file). Highest priority candidate except for an explicit +argument to `autoload-make-feature-name' (q.v.).") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Magic strings in source files + +(defconst generate-autoload-cookie ";;;###autoload" + "Magic comment indicating the following form should be autoloaded. +Used by `update-file-autoloads'. This string should be +meaningless to Lisp (e.g., a comment). + +This string is used: + +;;;###autoload +\(defun function-to-be-autoloaded () ...) + +If this string appears alone on a line, the following form will be +read and an autoload made for it. If it is followed by the string +\"immediate\", then the form on the following line will be copied +verbatim. If there is further text on the line, that text will be +copied verbatim to `generated-autoload-file'.") + +(defconst generate-c-autoload-cookie "/* ###autoload" + "Magic C comment indicating the following form should be autoloaded. +Used by `update-file-autoloads'. This string should be +meaningless to C (e.g., a comment). + +This string is used: + +/* ###autoload */ +DEFUN (\"function-to-be-autoloaded\", ... ) + +If this string appears alone on a line, the following form will be +read and an autoload made for it. If there is further text on the line, +that text will be copied verbatim to `generated-autoload-file'.") + +(defconst generate-c-autoload-module "/* ###module" + "Magic C comment indicating the module containing autoloaded functions. +Since a module can consist of multiple C files, the module name may not be +the same as the C source file base name. In that case, use this comment to +indicate the actual name of the module from which to autoload functions.") + +(defconst generate-autoload-section-header "\f\n;;;### " + "String inserted before the form identifying +the section of autoloads for a file.") + +(defconst generate-autoload-section-trailer "\n;;;***\n" + "String which indicates the end of the section of autoloads for a file.") + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Parsing the source file text. +;; Autoloads in C source differ from those in Lisp source. For historical +;; reasons, functions handling only Lisp don't have "lisp" in their names; +;; maybe this should be changed. + (defun make-autoload (form file) "Turn a definition generator FORM into an autoload for source file FILE. Returns nil if FORM is not a defun, defun*, defmacro, defmacro*, @@ -104,102 +279,27 @@ (list 'autoload (list 'quote func-name) module (buffer-substring begin (point)) interact nil)))) -(defvar generate-autoload-cookie ";;;###autoload" - "Magic comment indicating the following form should be autoloaded. -Used by `update-file-autoloads'. This string should be -meaningless to Lisp (e.g., a comment). - -This string is used: - -;;;###autoload -\(defun function-to-be-autoloaded () ...) - -If this string appears alone on a line, the following form will be -read and an autoload made for it. If it is followed by the string -\"immediate\", then the form on the following line will be copied -verbatim. If there is further text on the line, that text will be -copied verbatim to `generated-autoload-file'.") - -(defvar generate-c-autoload-cookie "/* ###autoload" - "Magic C comment indicating the following form should be autoloaded. -Used by `update-file-autoloads'. This string should be -meaningless to C (e.g., a comment). - -This string is used: - -/* ###autoload */ -DEFUN (\"function-to-be-autoloaded\", ... ) - -If this string appears alone on a line, the following form will be -read and an autoload made for it. If there is further text on the line, -that text will be copied verbatim to `generated-autoload-file'.") - -(defvar generate-c-autoload-module "/* ###module" - "Magic C comment indicating the module containing autoloaded functions. -Since a module can consist of multiple C files, the module name may not be -the same as the C source file base name. In that case, use this comment to -indicate the actual name of the module from which to autoload functions.") - -(defvar generate-autoload-section-header "\f\n;;;### " - "String inserted before the form identifying -the section of autoloads for a file.") - -(defvar generate-autoload-section-trailer "\n;;;***\n" - "String which indicates the end of the section of autoloads for a file.") - -(defvar autoload-package-name nil) - -;;; Forms which have doc-strings which should be printed specially. -;;; A doc-string-elt property of ELT says that (nth ELT FORM) is -;;; the doc-string in FORM. -;;; -;;; There used to be the following note here: -;;; ;;; Note: defconst and defvar should NOT be marked in this way. -;;; ;;; We don't want to produce defconsts and defvars that -;;; ;;; make-docfile can grok, because then it would grok them twice, -;;; ;;; once in foo.el (where they are given with ;;;###autoload) and -;;; ;;; once in loaddefs.el. -;;; -;;; Counter-note: Yes, they should be marked in this way. -;;; make-docfile only processes those files that are loaded into the -;;; dumped Emacs, and those files should never have anything -;;; autoloaded here. The above-feared problem only occurs with files -;;; which have autoloaded entries *and* are processed by make-docfile; -;;; there should be no such files. - -(put 'autoload 'doc-string-elt 3) -(put 'defun 'doc-string-elt 3) -(put 'defun* 'doc-string-elt 3) -(put 'defvar 'doc-string-elt 3) -(put 'defconst 'doc-string-elt 3) -(put 'defmacro 'doc-string-elt 3) -(put 'defmacro* 'doc-string-elt 3) -(put 'define-skeleton 'doc-string-elt 3) -(put 'define-derived-mode 'doc-string-elt 4) - -(defun autoload-trim-file-name (file) - "Returns a relative pathname of FILE including the last directory." - (setq file (expand-file-name file)) - (replace-in-string - (file-relative-name file (file-name-directory - (directory-file-name - (file-name-directory file)))) - "\\\\" "/")) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Generating autoloads for a single file ;;;###autoload (defun generate-file-autoloads (file &optional funlist) - "Insert at point a loaddefs autoload section for FILE. + "Insert at point an autoload section for FILE. autoloads are generated for defuns and defmacros in FILE marked by `generate-autoload-cookie' (which see). If FILE is being visited in a buffer, the contents of the buffer are used." (interactive "fGenerate autoloads for file: ") - (if (string-match "\\.el$" file) - (generate-file-autoloads-1 file funlist) - (generate-c-file-autoloads-1 file funlist))) + (cond ((string-match "\\.el$" file) + (generate-file-autoloads-1 file funlist)) + ;; #### jj, are C++ modules possible? + ((string-match "\\.c$" file) + (generate-c-file-autoloads-1 file funlist)) + (t + (error 'wrong-type-argument file "not a C or Elisp source file")))) (defun* generate-file-autoloads-1 (file funlist) - "Insert at point a loaddefs autoload section for FILE. + "Insert at point an autoload section for FILE. autoloads are generated for defuns and defmacros in FILE marked by `generate-autoload-cookie' (which see). If FILE is being visited in a buffer, the contents of the buffer @@ -279,8 +379,8 @@ (cond ((looking-at "immediate\\s *$") ; XEmacs ;; This is here so that you can automatically ;; have small hook functions copied to - ;; loaddefs.el so that it's not necessary to - ;; load a whole file just to get a two-line + ;; auto-autoloads.el so that it's not necessary + ;; to load a whole file just to get a two-line ;; do-nothing find-file-hook... --Stig (forward-line 1) (setq begin (point)) @@ -312,7 +412,7 @@ (terpri outbuf) ;;;; (insert ";;; Generated autoloads from " ;;;; (autoload-trim-file-name file) "\n") - ;; Warn if we put a line in loaddefs.el + ;; Warn if we put a line in auto-autoloads.el ;; that is long enough to cause trouble. (when (< output-end (point)) (setq output-end (point-marker))) @@ -333,7 +433,7 @@ (message "Generating autoloads for %s...done" file)))) (defun* generate-c-file-autoloads-1 (file funlist) - "Insert at point a loaddefs autoload section for the C file FILE. + "Insert at point an autoload section for the C file FILE. autoloads are generated for defuns and defmacros in FILE marked by `generate-c-autoload-cookie' (which see). If FILE is being visited in a buffer, the contents of the buffer @@ -343,6 +443,8 @@ (load-name (replace-in-string (file-name-nondirectory file) "\\.c?$" "")) + (exists-p-format + "(file-exists-p (expand-file-name \"%s.%s\" module-directory))") (trim-name (autoload-trim-file-name file)) (print-length nil) (print-readably t) @@ -382,16 +484,14 @@ (if funlist (progn (message "Generating autoloads for %s..." trim-name) - (princ "(when (or\n" outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.ell\" module-directory))\n" - load-name) outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.dll\" module-directory))\n" - load-name) outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.so\" module-directory)))\n" - load-name) outbuf) + (princ "(when (or\n " outbuf) + (princ (format exists-p-format load-name "ell") outbuf) + (princ "\n " outbuf) + (princ (format exists-p-format load-name "dll") outbuf) + (princ "\n " outbuf) + (princ (format exists-p-format load-name "so") outbuf) + ;; close the princ'd `or' form + (princ ")\n " outbuf) (dolist (arg funlist) (goto-char (point-min)) (re-search-forward @@ -403,6 +503,7 @@ (when autoload (push (nth 1 (nth 1 autoload)) autoloads-done) (print-autoload autoload 3 outbuf " ")))) + ;; close the princ'd `when' form (princ ")" outbuf)) (goto-char (point-min)) (let ((match @@ -412,16 +513,14 @@ (return-from generate-c-file-autoloads-1)) (message "Generating autoloads for %s..." trim-name) - (princ "(when (or\n" outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.ell\" module-directory))\n" - load-name) outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.dll\" module-directory))\n" - load-name) outbuf) - (princ (format - " (file-exists-p (expand-file-name \"%s.so\" module-directory)))\n" - load-name) outbuf) + (princ "(when (or\n " outbuf) + (princ (format exists-p-format load-name "ell") outbuf) + (princ "\n " outbuf) + (princ (format exists-p-format load-name "dll") outbuf) + (princ "\n " outbuf) + (princ (format exists-p-format load-name "so") outbuf) + ;; close the princ'd `or' form + (princ ")\n " outbuf) (while match (forward-line 1) (let ((autoload (make-c-autoload load-name))) @@ -430,6 +529,7 @@ (print-autoload autoload 3 outbuf " "))) (setq match (search-forward generate-c-autoload-cookie nil t))) + ;; close the princ'd `when' form (princ ")" outbuf)))))) (unless visited ;; We created this buffer, so we should kill it. @@ -446,6 +546,8 @@ (or noninteractive ; XEmacs: only need one line in -batch mode. (message "Generating autoloads for %s...done" trim-name)))) +;; Assorted utilities for generating autoloads and pieces thereof + (defun print-autoload (autoload doc-string-elt outbuf margin) "Print an autoload form, handling special characters. In particular, print docstrings with escapes inserted before left parentheses @@ -514,36 +616,45 @@ (insert "\\^L"))) (goto-char p2))))) - -(defconst autoload-file-name "auto-autoloads.el" - "Generic filename to put autoloads into. -Unless you are an XEmacs maintainer, it is probably unwise to change this.") - -(defvar autoload-target-directory "../lisp/" - "Directory to put autoload declaration file into. -Unless you know what you're doing, don't mess with this.") +;;; Forms which have doc-strings which should be printed specially. +;;; A doc-string-elt property of ELT says that (nth ELT FORM) is +;;; the doc-string in FORM. +;;; +;;; defvar and defconst should be also be marked in this way. There is +;;; no interference from make-docfile, which only processes those files +;;; that are loaded into the dumped Emacs, and those files should +;;; never have anything autoloaded here. Problems only occur with files +;;; which have autoloaded entries *and* are processed by make-docfile; +;;; there should be no such files. -(defvar generated-autoload-file - (expand-file-name (concat autoload-target-directory - autoload-file-name) - data-directory) - "*File `update-file-autoloads' puts autoloads into. -A .el file can set this in its local variables section to make its -autoloads go somewhere else. +(put 'autoload 'doc-string-elt 3) +(put 'defun 'doc-string-elt 3) +(put 'defun* 'doc-string-elt 3) +(put 'defvar 'doc-string-elt 3) +(put 'defconst 'doc-string-elt 3) +(put 'defmacro 'doc-string-elt 3) +(put 'defmacro* 'doc-string-elt 3) +(put 'define-skeleton 'doc-string-elt 3) +(put 'define-derived-mode 'doc-string-elt 4) -Note that `batch-update-directory' binds this variable to its own value, -generally the file named `autoload-file-name' in the directory being -updated.") +(defun autoload-trim-file-name (file) + "Returns relative pathname of FILE including the last directory. -(defconst cusload-file-name "custom-load.el" - "Generic filename to put custom loads into. -Unless you are an XEmacs maintainer, it is probably unwise to change this.") +Hard-codes the directory separator as a forward slash." + (setq file (expand-file-name file)) + (replace-in-string + (file-relative-name file (file-name-directory + (directory-file-name + (file-name-directory file)))) + ;; #### is this a good idea? + "\\\\" "/")) ;;;###autoload (defun update-file-autoloads (file) "Update the autoloads for FILE in `generated-autoload-file' \(which FILE might bind in its local variables). -This function refuses to update autoloads files." +This function is a no-op for an autoloads file (ie, a file whose name is +equal to `autoload-file-name')." (interactive "fUpdate autoloads for file: ") (setq file (expand-file-name file)) (when (and (file-newer-than-file-p file generated-autoload-file) @@ -638,6 +749,78 @@ (if (stringp file) (generate-file-autoloads file))))))) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Utilities for batch updates + +;;;###autoload +(defun autoload-update-directory-autoloads () + "Update the autoloads for a directory, using a specified feature prefix. +Must be used only with -batch. The feature prefix and directory to update +are taken from the first and second elements of `command-line-args-left', +respectively, and they are then removed from `command-line-args-left'. + +Runs `update-file-autoloads' on each file in the given directory. Always +rewrites the autoloads file, even if unchanged. Makes a feature name by +applying `autoload-make-feature-name' to the specified feature prefix. + +#### The API and semantics of this function are subject to change." + (unless noninteractive + (error "autoload-batch-update-autoloads: may be used only with -batch")) + (let* ((autoload-feature-prefix (car command-line-args-left)) + (dir (cadr command-line-args-left)) + (generated-autoload-file (expand-file-name autoload-file-name dir))) + (update-autoload-files (list dir) t t) + (setq command-line-args-left (cddr command-line-args-left)))) + +;;;###autoload +(defun update-autoload-files (files-or-dirs &optional all-into-one-file force) + "Update all the autoload files associated with FILES-OR-DIRS. +FILES-OR-DIRS is a list of files and/or directories to be processed. + +An appropriate autoload file is chosen and a feature constructed for +each element of FILES-OR-DIRS. Fixup code testing for the autoload file's +feature and to provide the feature is added. + +If optional ALL-INTO-ONE-FILE is non-`nil', `generated-autoload-file' +should be set to the name of an autoload file and all autoloads will be +placed in that file. `autoload-feature-prefix' should be set to an +appropriate prefix which will be concatenated with \"-autoloads\" to +produce the feature name. Otherwise the appropriate autoload file for +each file or directory (located in that directory, or in the directory of +the specified file) will be updated with the directory's or file's +autoloads and the protective forms will be added, and the files will be +saved. Use of the default here is unreliable, and therefore deprecated. + +Note that if some of FILES-OR-DIRS are directories, recursion goes only +one level deep. + +If FORCE is non-nil, always save out the autoload files even if unchanged." + (let ((defdir (directory-file-name default-directory)) + ;; value for all-into-one-file + (autoload-feature-name (autoload-make-feature-name)) + (enable-local-eval nil)) ; Don't query in batch mode. + (dolist (arg files-or-dirs) + (setq arg (expand-file-name arg defdir)) + (cond + ((file-directory-p arg) + (message "Updating autoloads for directory %s..." arg) + (update-autoloads-from-directory arg)) + ((file-exists-p arg) + (update-file-autoloads arg)) + (t (error "No such file or directory: %s" arg))) + (when (not all-into-one-file) + (autoload-featurep-protect-autoloads + (autoload-make-feature-name + (file-name-nondirectory (directory-file-name arg)))) + (if force (set-buffer-modified-p + t (find-file-noselect generated-autoload-file))))) + (when all-into-one-file + (autoload-featurep-protect-autoloads autoload-feature-name) + (if force (set-buffer-modified-p + t (find-file-noselect generated-autoload-file)))) + (save-some-buffers t) + )) + ;;;###autoload (defun update-autoloads-from-directory (dir) "Update `generated-autoload-file' with all the current autoloads from DIR. @@ -652,7 +835,7 @@ (setq dir (expand-file-name dir)) (let ((simple-dir (file-name-as-directory (file-name-nondirectory - (directory-file-name dir)))) + (directory-file-name dir)))) (enable-local-eval nil)) (save-excursion (let ((find-file-hooks nil)) @@ -678,7 +861,7 @@ (unless noninteractive (save-buffer))))) -(defun fixup-autoload-buffer (sym) +(defun autoload-featurep-protect-autoloads (sym) (save-excursion (set-buffer (find-file-noselect generated-autoload-file)) (goto-char (point-min)) @@ -691,61 +874,45 @@ (goto-char (point-max)) (insert "\n(provide '" sym ")\n"))))) -(defvar autoload-package-name nil) +(defun autoload-make-feature-name (&optional prefix) + "Generate the feature name to protect this auto-autoloads file from PREFIX. -;;;###autoload -(defun update-autoload-files (files-or-dirs &optional all-into-one-file force) - "Update all the autoload files associated with FILES-OR-DIRS. -FILES-OR-DIRS should be a list of files or directories to be -processed. If ALL-INTO-ONE-FILE is not given, the appropriate -autoload file for each file or directory (located in that directory, -or in the directory of the specified file) will be updated with the -directory's or file's autoloads, some additional fixup text will be -added, and the files will be saved. If ALL-INTO-ONE-FILE is given, -`generated-autoload-file' should be set to the name of the autoload -file into which the autoloads will be generated, and the autoloads -for all files and directories will go into that same file. +If PREFIX is nil, it defaults to the value of `autoload-feature-prefix' if +that is non-nil. + +The feature name must be globally unique for this version of XEmacs, +including packages. -If FORCE is non-nil, always save out the autoload files even if unchanged." - (let ((defdir (directory-file-name default-directory)) - (enable-local-eval nil)) ; Don't query in batch mode. - ;; (message "Updating autoloads in %s..." generated-autoload-file) - (dolist (arg files-or-dirs) - (setq arg (expand-file-name arg defdir)) - (let ((generated-autoload-file - (if all-into-one-file generated-autoload-file - (expand-file-name autoload-file-name - (if (file-directory-p arg) arg - (file-name-directory arg)))))) - (cond - ((file-directory-p arg) - (message "Updating autoloads for directory %s..." arg) - (update-autoloads-from-directory arg)) - ((file-exists-p arg) - (update-file-autoloads arg)) - (t (error "No such file or directory: %s" arg))) - (when (not all-into-one-file) - (fixup-autoload-buffer (concat (if autoload-package-name - autoload-package-name - (file-name-nondirectory defdir)) - "-autoloads")) - (if force (set-buffer-modified-p - t (find-file-noselect generated-autoload-file)))))) - (when all-into-one-file - (fixup-autoload-buffer (concat (if autoload-package-name - autoload-package-name - (file-name-nondirectory defdir)) - "-autoloads")) - (if force (set-buffer-modified-p - t (find-file-noselect generated-autoload-file)))) - (save-some-buffers t) - ;; (message "Done") - )) +For backward compatibility, if PREFIX and `autoload-feature-prefix' are both +`nil', PREFIX is computed as the last directory component of +`generated-autoload-file'. This is likely to result in non-uniqueness, so +do not use this feature." + (concat + (cond (prefix) + (autoload-feature-prefix) + ((stringp generated-autoload-file) + (message "Warning: autoload computing feature prefix. +You should specify it as an argument to `autoload-make-feature-name'.") + (file-name-nondirectory + (directory-file-name + (file-name-directory generated-autoload-file)))) + (t (error 'invalid-argument + "Could not compute a feature name"))) + "-autoloads")) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; Deprecated entry points + +;; A grep of the core and packages shows use of `batch-update-autoloads' +;; by XEmacs.rules, pcomplete, eshell, oort-gnus; `batch-update-directory' +;; by liece. ;; #### these entry points below are a big mess, especially the ;; first two. there don't seem to be very many packages that use the ;; first one (the "all-into-one-file" variety), and do they actually ;; rely on this functionality? --ben +;; but XEmacs.rules does, though maybe it doesn't "rely" on it, and +;; modules do now, and that relies on it. --sjt ;;;###autoload (defun batch-update-autoloads () @@ -765,7 +932,9 @@ (defun batch-update-directory () "Update the autoloads for the directories on the command line. Runs `update-file-autoloads' on each file in the given directory, and must -be used only with -batch." +be used only with -batch. + +Uses and removes the first element of `command-line-args-left'." (unless noninteractive (error "batch-update-directory is to be used only with -batch")) (update-autoload-files command-line-args-left) @@ -778,7 +947,7 @@ Runs `update-file-autoloads' on each file in the given directory, and must be used only with -batch." (unless noninteractive - (error "batch-update-directory is to be used only with -batch")) + (error "batch-update-one-directory is to be used only with -batch")) (let ((arg (car command-line-args-left))) (setq command-line-args-left (cdr command-line-args-left)) (update-autoload-files (list arg)))) @@ -787,14 +956,29 @@ (defun batch-force-update-one-directory () "Update the autoloads for a single directory on the command line. Runs `update-file-autoloads' on each file in the given directory, and must -be used only with -batch. Always rewrite the autoloads file, even if -unchanged." +be used only with -batch. Always rewrites the autoloads file, even if +unchanged. + +Uses and removes the first element of `command-line-args-left'." (unless noninteractive - (error "batch-update-directory is to be used only with -batch")) + (error "batch-force-update-directory is to be used only with -batch")) (let ((arg (car command-line-args-left))) (setq command-line-args-left (cdr command-line-args-left)) (update-autoload-files (list arg) nil t))) +;; Declare obsolescence + +(make-obsolete-variable 'autoload-target-directory + "Don't use this. Bind `generated-autoload-file' to an absolute path.") +(make-obsolete 'batch-update-autoloads + 'autoload-update-directory-autoloads) +(make-obsolete 'batch-update-directory + 'autoload-update-directory-autoloads) +(make-obsolete 'batch-update-one-directory + 'autoload-update-directory-autoloads) +(make-obsolete 'batch-force-update-one-directory + 'autoload-update-directory-autoloads) + (provide 'autoload) ;;; autoload.el ends here
--- a/lisp/info.el Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/info.el Thu Jan 23 11:39:01 2003 +0000 @@ -1040,7 +1040,7 @@ (setq lbuffers (cdr lbuffers))) (message "Composing main Info directory...done")) (setq Info-dir-contents (buffer-string))) - (setq default-directory Info-dir-contents-directory) + (setq default-directory (file-name-as-directory Info-dir-contents-directory)) (setq buffer-file-name (caar Info-dir-file-attributes))) (defmacro Info-directory-files (dir-file &optional all full nosort files-only)
--- a/lisp/startup.el Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/startup.el Thu Jan 23 11:39:01 2003 +0000 @@ -542,6 +542,9 @@ nil) (startup-setup-paths-warning)) + ;; Either we need to inhibit messages from do_autoloads, or this + ;; should go into (command-line) after the initialization of the + ;; frame? (startup-load-autoloads) (let (error-data) @@ -747,7 +750,7 @@ ;; In this case, I completely agree. --ben (if (featurep 'menubar) (init-menubar-at-startup)) - ;; perhaps this should go earlier in the proecess? + ;; perhaps this should go earlier in the process? (if (featurep 'mule) (declare-fboundp (init-mule-at-startup))) @@ -1247,7 +1250,7 @@ (defun splash-frame-body () `[((face (blue bold underline) "\nDistribution, copying license, warranty:\n\n") - "Please visit the XEmacs website at http://www.xemacs.org !\n\n" + "Please visit the XEmacs website at http://www.xemacs.org/ !\n\n" ,@(if (featurep 'sparcworks) `( "\ Sun provides support for the WorkShop/XEmacs integration package only. @@ -1303,7 +1306,7 @@ ((key about-xemacs) ": see who's developing XEmacs\n")) ((face (blue bold underline) "\nUseful stuff:\n\n") - "Things that you should know rather quickly...\n\n" + "Things that you should learn rather quickly...\n\n" ((key find-file) ": visit a file\n") ((key save-buffer) ": save changes\n") ((key undo) ": undo changes\n") @@ -1430,20 +1433,24 @@ t))))) (defun startup-load-autoloads () - (if (and (not inhibit-autoloads) - lisp-directory) + (when (and (not inhibit-autoloads) lisp-directory) + (load (expand-file-name (file-name-sans-extension autoload-file-name) + lisp-directory) + nil t) + (when (featurep 'mule) (load (expand-file-name (file-name-sans-extension autoload-file-name) - lisp-directory) nil t)) + (file-name-as-directory + (expand-file-name "mule" lisp-directory))) + nil t))) ;; Hey! Let's use a packages-* function for a non-package purpose! - (if (and (not inhibit-autoloads) (featurep 'modules)) - (packages-load-package-auto-autoloads module-load-path)) + (when (and (not inhibit-autoloads) (featurep 'modules)) + (packages-load-package-auto-autoloads module-load-path)) - (if (and (not inhibit-autoloads) (not inhibit-all-packages)) - (progn - (if (not inhibit-early-packages) - (packages-load-package-auto-autoloads early-package-load-path)) - (packages-load-package-auto-autoloads late-package-load-path) - (packages-load-package-auto-autoloads last-package-load-path)))) + (unless (or inhibit-autoloads inhibit-all-packages) + (unless inhibit-early-packages + (packages-load-package-auto-autoloads early-package-load-path)) + (packages-load-package-auto-autoloads late-package-load-path) + (packages-load-package-auto-autoloads last-package-load-path))) ;;; startup.el ends here
--- a/lisp/update-elc-2.el Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/update-elc-2.el Thu Jan 23 11:39:01 2003 +0000 @@ -144,17 +144,30 @@ (message "Recompiling updated .els in directory tree `%s'...done" dir) ;; don't depend on being able to autoload `update-autoload-files'! (load "autoload") - (update-autoload-files (list dir)) - (byte-recompile-file (expand-file-name "auto-autoloads.el" dir) 0) - (if (featurep 'modules) + ;; #### the API used here is deprecated, convert to one with explicit + ;; arguments when it is available + (let ((generated-autoload-file (expand-file-name "auto-autoloads.el" dir)) + (autoload-package-name "auto")) ; feature prefix + (update-autoload-files (list dir)) + (byte-recompile-file generated-autoload-file 0)) + (when (featurep 'modules) (let* ((moddir (expand-file-name "../modules" (file-truename dir))) (generated-autoload-file - (expand-file-name "auto-autoloads.el" moddir))) - (update-autoload-files (directory-files moddir t nil nil 0) t) + (expand-file-name "auto-autoloads.el" moddir)) + (autoload-package-name "modules")) ; feature prefix + (update-autoload-files + (delete (concat (file-name-as-directory moddir) ".") + (delete (concat (file-name-as-directory moddir) "..") + (directory-files moddir t nil nil 0))) + t) (byte-recompile-file generated-autoload-file 0))) (when (featurep 'mule) - (update-autoload-files (list (expand-file-name "mule" dir))) - (byte-recompile-file (expand-file-name "mule/auto-autoloads.el" dir) 0)) + (let* ((muledir (expand-file-name "../modules" (file-truename dir))) + (generated-autoload-file + (expand-file-name "auto-autoloads.el" muledir)) + (autoload-package-name "mule")) ; feature prefix + (update-autoload-files (list muledir)) + (byte-recompile-file generated-autoload-file 0))) ;; likewise here. (load "cus-dep") (Custom-make-dependencies dir)
--- a/lisp/update-elc.el Thu Jan 23 11:24:13 2003 +0000 +++ b/lisp/update-elc.el Thu Jan 23 11:39:01 2003 +0000 @@ -242,9 +242,10 @@ need-to-rebuild-mule-autoloads) '("-l" "autoload")) (if need-to-rebuild-autoloads - '("-f" "batch-force-update-one-directory" "../lisp")) + '("-f" "autoload-update-directory-autoloads" "auto" "../lisp")) (if need-to-rebuild-mule-autoloads - '("-f" "batch-force-update-one-directory" "../lisp/mule")) + '("-f" "autoload-update-directory-autoloads" + "mule" "../lisp/mule")) (if need-to-recompile-autoloads '("-f" "batch-byte-compile-one-file" "../lisp/auto-autoloads.el"))