Commits

Anonymous committed 4efa9eb

[xemacs-21-4-hg @ 2001-12-17 05:49:04 by stephent]
Prerelease commit for 21.4.6.

Comments (0)

Files changed (66)

etc/package-index.LATEST.pgp

 ;; Package Index file -- Do not edit manually.
 ;;;@@@
 (package-get-update-base-entry (quote
+(clearcase
+  (standards-version 1.0
+   version "1.00"
+   author-version "21.5b3"
+   date "2001-12-09"
+   build-date "2001-12-10"
+   maintainer "Adrian Aichner <adrian@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "New Clearcase Version Control for XEmacs (UNIX, Windows)."
+   filename "clearcase-1.00-pkg.tar.gz"
+   md5sum "6ae8f1896b97f90a94a6391beeb6f018"
+   size 88185
+   provides (clearcase)
+   requires (dired fsf-compat mail-lib xemacs-base)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
+(tramp
+  (standards-version 1.1
+   version "1.00"
+   author-version "2.46"
+   date "2001-12-08"
+   build-date "2001-12-08"
+   maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
+   distribution xemacs
+   priority low
+   category "standard"
+   dump nil
+   description "Remote shell-based file editing."
+   filename "tramp-1.00-pkg.tar.gz"
+   md5sum "31d4925445293ad091381218fc9e10fa"
+   size 130274
+   provides (tramp tramp-util tramp-vc trampcache)
+   requires (tramp xemacs-base vc fsf-compat efs dired mail-lib gnus)
+   type regular
+))
+))
+;;;@@@
+(package-get-update-base-entry (quote
 (dictionary
   (standards-version 1.1
-   version "1.00"
-   author-version "1.5.1"
-   date "2001-09-08"
-   build-date "2001-09-08"
-   maintainer "Torsten Hilbrich <Torsten.Hilbrich@gmx.net>"
+   version "1.05"
+   author-version "1.7"
+   date "2001-12-15"
+   build-date "2001-12-16"
+   maintainer "Torsten Hilbrich <dictionary@myrkr.in-berlin.de>"
    distribution xemacs
    priority low
    category "standard"
    dump nil
-   description "Interface to web-based dictionary servers."
-   filename "dictionary-1.00-pkg.tar.gz"
-   md5sum "0ddd726dc03a88b7b25afcc0fea8061e"
-   size 33740
+   description "Interface to RFC2229 dictionary servers."
+   filename "dictionary-1.05-pkg.tar.gz"
+   md5sum "17b8074cee3e85f26f939a26a3848daf"
+   size 37435
    provides (dictionary connection link)
    requires (xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (build
   (standards-version 1.0
-   version "1.02"
-   author-version "21.5b1"
-   date "2001-05-13"
-   build-date "2001-05-18"
+   version "1.03"
+   author-version "21.5b3"
+   date "2001-12-02"
+   build-date "2001-12-03"
    maintainer "Adrian Aichner <adrian@xemacs.org>"
    distribution stable
    priority low
    category "standard"
    dump nil
    description "Build XEmacs from within (UNIX, Windows)."
-   filename "build-1.02-pkg.tar.gz"
-   md5sum "d87ec24561d70f8185a68e95a7e1e8d9"
-   size 31070
+   filename "build-1.03-pkg.tar.gz"
+   md5sum "beaa6b5e8731f13de47c4b5d5ef6fde4"
+   size 31341
    provides (build)
    requires (xemacs-base pcl-cvs dired w3 prog-modes)
    type regular
 (package-get-update-base-entry (quote
 (calendar
   (standards-version 1.1
-   version "1.16"
-   author-version "21.1"
-   date "2000-09-12"
-   build-date "2001-01-15"
+   version "1.17"
+   author-version "21.5b3"
+   date "2001-12-10"
+   build-date "2001-12-10"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority low
-   category "oa"
+   category "standard"
    dump nil
    description "Calendar and diary support."
-   filename "calendar-1.16-pkg.tar.gz"
-   md5sum "ed44e3211ecddcfc98e1e517a97ed11d"
-   size 253214
+   filename "calendar-1.17-pkg.tar.gz"
+   md5sum "8821f0209b1ecf2bdb24cddb5b480956"
+   size 252183
    provides (appt cal-dst cal-french cal-mayan cal-x cal-xemacs calendar diary-ins diary-lib holidays lunar solar)
    requires (xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (edit-utils
   (standards-version 1.1
-   version "1.70"
+   version "1.73"
    author-version "21.5b3"
-   date "2001-09-29"
-   build-date "2001-09-29"
+   date "2001-12-13"
+   build-date "2001-12-13"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority high
    category "standard"
    dump nil
    description "Miscellaneous editor extensions, you probably need this."
-   filename "edit-utils-1.70-pkg.tar.gz"
-   md5sum "a2e998a2ead4985dfdf323b293de0e34"
-   size 693688
+   filename "edit-utils-1.73-pkg.tar.gz"
+   md5sum "508d8b321a81bfc69b2ddc3ae3f49174"
+   size 697616
    provides (abbrevlist atomic-extents avoid backup-dir balloon-help big-menubar blink-cursor blink-paren bookmark compare-w completion dabbrev desktop detached-minibuf edit-toolbar fast-lock file-part floating-toolbar flow-ctrl foldout func-menu hippie-exp icomplete id-select info-look iswitchb lazy-lock lazy-shot live-icon man mic-paren paren popper mode-motion+ outl-mouse page-ext blink-paren paren permanent-buffers recent-files redo reportmail rsz-minibuf saveconfsavehist saveplace scroll-in-place tempo toolbar-utils tree-menu uniquify where-was-i-db)
-   requires (xemacs-base)
+   requires (xemacs-base fsf-compat)
    type single
 ))
 ))
 (package-get-update-base-entry (quote
 (viper
   (standards-version 1.1
-   version "1.28"
+   version "1.29"
    author-version "3.09"
-   date "2001-09-13"
-   build-date "2001-09-29"
+   date "2001-10-13"
+   build-date "2001-11-26"
    maintainer "Michael Kifer <kifer@cs.sunysb.edu>"
    distribution xemacs
    priority low
    category "standard"
    dump nil
    description "VI emulation support."
-   filename "viper-1.28-pkg.tar.gz"
-   md5sum "4c0252ab4badb8d57a475f572c924950"
-   size 326968
+   filename "viper-1.29-pkg.tar.gz"
+   md5sum "aa4126c14967ab99fe5584ff8d1d7365"
+   size 327443
    provides (viper)
    requires (xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (auctex
   (standards-version 1.1
-   version "1.25"
-   author-version "9.9p"
-   date "2001-07-31"
-   build-date "2001-07-31"
+   version "1.28"
+   author-version "10.0g"
+   date "2001-12-13"
+   build-date "2001-12-13"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority medium
    category "standard"
    dump nil
    description "Basic TeX/LaTeX support."
-   filename "auctex-1.25-pkg.tar.gz"
-   md5sum "38da993fc10bc64251516b1e6019b6df"
-   size 375805
+   filename "auctex-1.28-pkg.tar.gz"
+   md5sum "a159936d264c746b33776ca9ec078ee8"
+   size 385145
    provides (auc-old bib-cite font-latex latex multi-prompt tex-buf tex-info tex-jp tex-site tex)
    requires (xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (vc
   (standards-version 1.1
-   version "1.28"
-   author-version "21.5b1"
-   date "2001-07-14"
-   build-date "2001-07-15"
+   version "1.29"
+   author-version "21.5b3"
+   date "2001-12-03"
+   build-date "2001-12-03"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority low
    category "standard"
    dump nil
    description "Version Control for Free systems."
-   filename "vc-1.28-pkg.tar.gz"
-   md5sum "aab5d4e8030489a6ba35e078b7fba75d"
-   size 90997
+   filename "vc-1.29-pkg.tar.gz"
+   md5sum "2c183467360502ae808424ecb179d178"
+   size 91255
    provides (vc)
    requires (dired xemacs-base vc mail-lib ediff)
    type regular
 (package-get-update-base-entry (quote
 (vc-cc
   (standards-version 1.1
-   version "1.16"
-   author-version "21.5b1"
-   date "2001-06-21"
-   build-date "2001-07-02"
+   version "1.18"
+   author-version "21.5b3"
+   date "2001-12-10"
+   build-date "2001-12-10"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority low
    category "standard"
    dump nil
    description "Version Control for ClearCase (UnFree) systems."
-   filename "vc-cc-1.16-pkg.tar.gz"
-   md5sum "853409332e6aadded46789d680f18603"
-   size 96131
+   filename "vc-cc-1.18-pkg.tar.gz"
+   md5sum "6885bb091d1fd108a7ec4353a96016ec"
+   size 94520
    provides (vc)
    requires (dired xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (prog-modes
   (standards-version 1.1
-   version "1.42"
+   version "1.44"
    author-version "21.5b3"
-   date "2001-09-10"
-   build-date "2001-09-11"
+   date "2001-12-05"
+   build-date "2001-12-10"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority medium
    category "standard"
    dump nil
    description "Support for various programming languages."
-   filename "prog-modes-1.42-pkg.tar.gz"
-   md5sum "4ba722cc3e4f2ad6e7ce3d8b4c20451c"
-   size 719924
+   filename "prog-modes-1.44-pkg.tar.gz"
+   md5sum "dbe40bbe4ec194c5ed777b0c5f1548ea"
+   size 720453
    provides (autoconf-mode cperl-mode eiffel3 f90 fortran ksh-mode m4-mode makefile perl-mode postscript python-mode rexx-mode simula-mode tcl teco verilog-mod)
    requires (mail-lib xemacs-devel xemacs-base cc-mode ps-print-nomule fsf-compat edit-utils ediff emerge efs)
    type regular
 (package-get-update-base-entry (quote
 (jde
   (standards-version 1.1
-   version "1.30"
-   author-version "2.2.7.1"
-   date "2001-08-16"
-   build-date "2001-09-01"
+   version "1.31"
+   author-version "2.2.8"
+   date "2001-10-14"
+   build-date "2001-11-26"
    maintainer "Paul Kinnucan <paulk@mathworks.com>"
    distribution xemacs
    priority medium
    category "standard"
    dump nil
    description "Java language and development support."
-   filename "jde-1.30-pkg.tar.gz"
-   md5sum "b1ca34ac01d8ae427ff0f237dea5571d"
-   size 1168891
+   filename "jde-1.31-pkg.tar.gz"
+   md5sum "1013e43ea81d2cc354da2bb19f44b205"
+   size 1620042
    provides (jde)
-   requires (jde cc-mode semantic debug speedbar edit-utils eterm mail-lib xemacs-base eieio elib sh-script)
+   requires (jde cc-mode semantic debug speedbar edit-utils eterm mail-lib xemacs-base xemacs-devel eieio elib sh-script)
    type regular
 ))
 ))
 (package-get-update-base-entry (quote
 (vm
   (standards-version 1.1
-   version "6.96"
-   author-version "6.96"
-   date "2001-09-08"
-   build-date "2001-09-08"
+   version "7.00"
+   author-version "7.00"
+   date "2001-12-09"
+   build-date "2001-12-09"
    maintainer "Kyle Jones <kyle_jones@wonderworks.com>"
    distribution xemacs
    priority medium
    category "standard"
    dump nil
    description "An Emacs mailer."
-   filename "vm-6.96-pkg.tar.gz"
-   md5sum "03d125b07ff2545700667ad89493eceb"
-   size 670733
+   filename "vm-7.00-pkg.tar.gz"
+   md5sum "5cda132d6599eab758ff8623f93bad40"
+   size 699259
    provides (vm)
    requires (mail-lib xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (mail-lib
   (standards-version 1.1
-   version "1.39"
-   author-version "21.5b1"
-   date "2001-06-16"
-   build-date "2001-07-02"
+   version "1.40"
+   author-version "21.5b3"
+   date "2001-11-27"
+   build-date "2001-11-28"
    maintainer "Simon Josefsson <simon@josefsson.org>"
    distribution xemacs
    priority medium
    category "standard"
    dump nil
    description "Fundamental lisp files for providing email support."
-   filename "mail-lib-1.39-pkg.tar.gz"
-   md5sum "2d383f2df395fc58294acfc1f18d3297"
-   size 164396
+   filename "mail-lib-1.40-pkg.tar.gz"
+   md5sum "9bac3da5281026155fd6fadb93efb938"
+   size 177170
    provides (browse-url highlight-headers mail-abbrevs mail-extr mail-utils reporter rfc822 rmail-mini rmailout sendmail smtpmail)
    requires (eterm xemacs-base)
    type regular
 (package-get-update-base-entry (quote
 (xemacs-base
   (standards-version 1.1
-   version "1.55"
-   author-version "21.5b1"
-   date "2001-05-20"
-   build-date "2001-06-14"
+   version "1.56"
+   author-version "21.5b3"
+   date "2001-12-10"
+   build-date "2001-12-10"
    maintainer "XEmacs Development Team <xemacs-beta@xemacs.org>"
    distribution xemacs
    priority high
    category "standard"
    dump nil
    description "Fundamental XEmacs support, you almost certainly need this."
-   filename "xemacs-base-1.55-pkg.tar.gz"
-   md5sum "611942669d8bda6b562bde3c6b2e92ab"
-   size 452673
-   provides (add-log advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline overlay passwd pp regi ring shell skeleton sort thing time-stamp timezone xbm-button xpm-button)
+   filename "xemacs-base-1.56-pkg.tar.gz"
+   md5sum "c619c482b36b55468f4e29d775b2f12f"
+   size 454879
+   provides (add-log advice annotations assoc case-table chistory comint-xemacs comint compile debug ebuff-menu echistory edmacro ehelp electric enriched env facemenu ffap helper imenu iso-syntax macros novice outline overlay passwd pp regi ring shell skeleton sort thing time-stamp timezone xbm-button xpm-button tq)
    requires ()
    type regular
 ))

etc/photos/jan.png

Added
New image
+2001-11-21  Stephen J. Turnbull  <stephen@xemacs.org>
+
+	* package-net.el: Inadvertant synch with Windows branch.  From
+	Andy's log:
+	(package-net-kit-version): new variable.
+	(package-net-generate-bin-ini): use it. Remove unwanted functions.
+
+2001-11-28  Steve Youngs  <youngs@xemacs.org>
+
+	* package-get.el (package-get-locate-index-file): Also search the
+	core etc/ directory for the package index file if it can't be
+	found in ~/.xemacs/.
+
+2001-12-13  William Perry  <wmperry@gnu.org>
+
+	* dialog-gtk.el (popup-builtin-question-dialog):
+	Conform to API in gui.c.
+	
+2001-11-12  Andy Piper  <andy@xemacs.org>
+
+	* cus-edit.el (custom-save-face-internal): make sure we save
+	non-themed faces.
+	(custom-save-variables): ditto variables.
+
+2001-11-20  Stephen J. Turnbull  <stephen@xemacs.og>
+
+	* faces.el (make-face-family):
+	(make-face-size):
+	New face-modifying functions per Jan Vroonhof.
+
+	cus-face.el (custom-set-face-font-family):
+	(custom-set-face-font-size):
+	Use them.
+
+	* font.el (font-window-system-mappings): More precise docstring.
+
+	(font-create-name):
+	(font-create-object):
+	(tty-font-create-object):
+	(tty-font-create-plist):
+	(x-font-create-object):
+	(x-font-create-name):
+	(ns-font-create-name):
+	(mswindows-font-create-object):
+	(mswindows-font-create-name):
+	Add doctrings.
+
+2001-11-14  John Paul Wallington <jpw@shootybangbang.com>
+
+	* gtk-faces.el (gtk-init-device-faces): removed spurious
+	quote before let* expression.
+
+2001-10-29  Andy Piper  <andy@xemacs.org>
+
+	* code-files.el (toggle-buffer-file-coding-system): mark buffer as
+	modified when changing coding system.
+
+	* toolbar-items.el (toolbar-dired): Use interactive "D" spec so
+	that we invoke the GUI directory selector.
+
+2001-10-25  Andy Piper  <andy@xemacs.org>
+
+	* dialog.el (make-dialog-box): use new directory dialog support.
+	* minibuf.el (read-file-name-1): ditto.
+	(read-file-name): ditto.
+	(read-directory-name): ditto.
+
 2001-10-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
 	* XEmacs 21.4.5 "Civil Service" is released.

lisp/code-files.el

 	   (coding-system-base buffer-file-coding-system)
 	   (cond ((eq eol-type 'lf) 'crlf)
 		 ((eq eol-type 'crlf) 'lf)
-		 ((eq eol-type 'cr) 'lf))))))
+		 ((eq eol-type 'cr) 'lf))))
+    (set-buffer-modified-p t)))
 
 (define-obsolete-function-alias
   'set-file-coding-system
  	(princ "\n"))
        (princ "(custom-set-variables")
        (mapatoms (lambda (symbol)
- 		  (let ((spec (car-safe (get symbol 'theme-value)))
+		  (let ((spec (car-safe (get symbol 'theme-value)))
  			(requests (get symbol 'custom-requests))
  			(now (not (or (get symbol 'standard-value)
  				      (and (not (boundp symbol))
  					   (not (eq (get symbol 'force-value)
 						    'rogue))))))
 			(comment (get symbol 'saved-variable-comment)))
- 		    (when (or (and spec (eq (car spec) 'user)
- 			       (eq (second spec) 'set)) comment)
+ 		    (when (or (and spec
+				   (eq (car spec) 'user)
+				   (eq (second spec) 'set))
+			      comment
+			      ;; support non-themed vars
+			      (and (null spec) (get symbol 'saved-value)))
  		      (princ "\n '(")
  		      (prin1 symbol)
  		      (princ " ")
 	      (and (not (find-face symbol))
 		   (not (eq (get symbol 'force-face) 'rogue)))))))
     (when (or (and (not (memq symbol custom-save-face-ignoring))
-	       ;; Don't print default face here.
-	       theme-spec
-	       (eq (car theme-spec) 'user)
-	       (eq (second theme-spec) 'set)) comment)
+		   ;; Don't print default face here.
+		   (or (and theme-spec
+			    (eq (car theme-spec) 'user)
+			    (eq (second theme-spec) 'set))
+		       ;; cope with non-themed faces
+		       (and (null theme-spec)
+			    (get symbol 'saved-face))))
+	      comment)
       (princ "\n '(")
       (prin1 symbol)
       (princ " ")
     (and image
 	 (image-instance-file-name image))))
 
+;; This consistently fails to dtrt
+;;(defun custom-set-face-font-size (face size &optional locale tags)
+;;  "Set the font of FACE to SIZE."
+;;  ;; #### should this call have tags in it?
+;;  (let* ((font (apply 'face-font-name face (list locale)))
+;;	 ;; Gag
+;;	 (fontobj (font-create-object font)))
+;;    (set-font-size fontobj size)
+;;    (apply 'font-set-face-font face fontobj locale tags)))
+
+;; From Jan Vroonhof -- see faces.el
 (defun custom-set-face-font-size (face size &optional locale tags)
   "Set the font of FACE to SIZE."
-  ;; #### should this call have tags in it?
-  (let* ((font (apply 'face-font-name face (list locale)))
-	 ;; Gag
-	 (fontobj (font-create-object font)))
-    (set-font-size fontobj size)
-    (apply 'font-set-face-font face fontobj locale tags)))
+  (make-face-size face size locale tags))
 
 (defun custom-face-font-size (face &rest args)
   "Return the size of the font of FACE as a string."
 	 (fontobj (font-create-object font)))
     (format "%s" (font-size fontobj))))
 
+;; Jan suggests this may not dtrt
+;;(defun custom-set-face-font-family (face family &optional locale tags)
+;;  "Set the font of FACE to FAMILY."
+;;  ;; #### should this call have tags in it?
+;;  (let* ((font (apply 'face-font-name face (list locale)))
+;;	 ;; Gag
+;;	 (fontobj (font-create-object font)))
+;;    (set-font-family fontobj family)
+;;    (apply 'font-set-face-font face fontobj locale tags)))
+
+;; From Jan Vroonhof -- see faces.el
 (defun custom-set-face-font-family (face family &optional locale tags)
   "Set the font of FACE to FAMILY."
-  ;; #### should this call have tags in it?
-  (let* ((font (apply 'face-font-name face (list locale)))
-	 ;; Gag
-	 (fontobj (font-create-object font)))
-    (set-font-family fontobj family)
-    (apply 'font-set-face-font face fontobj locale tags)))
+  (make-face-family face family locale tags))
 
 (defun custom-face-font-family (face &rest args)
   "Return the name of the font family of FACE."

lisp/dialog-gtk.el

 	(dialog nil)			; GtkDialog
 	(buttons nil)			; List of GtkButton objects
 	(activep t)
+	(callback nil)
 	(flushrightp nil)
+	(length nil)
 	(errp t))
     (if (not buttons-descr)
 	(error 'syntax-error
 		    (if (not (vectorp button))
 			(error "Button descriptor is not a vector: %S" button))
 
-		    (if (< (length button) 3)
-			(error "Button descriptor is too small: %S" button))
+		    (setq length (length button))
+
+		    (cond
+		     ((= length 1)	; [ "name" ]
+		      (setq callback nil
+			    activep nil))
+		     ((= length 2)	; [ "name" callback ]
+		      (setq callback (aref button 1)
+			    activep t))
+		     ((and (or (= length 3) (= length 4))
+			   (not (keywordp (aref button 2))))
+		      ;; [ "name" callback active-p ] or
+		      ;; [ "name" callback active-p suffix ]
+		      ;; We ignore the 'suffix' entry, because that is
+		      ;; what the X code does.
+		      (setq callback (aref button 1)
+			    activep (aref button 2)))
+		     (t			; 100% keyword specification
+		      (let ((plist (cdr (mapcar 'identity button))))
+			(setq activep (plist-get plist :active)
+			      callback (plist-get plist :callback)))))
 
 		    (push (gtk-button-new-with-label (aref button 0)) buttons)
-
-		    ;; Need to detect what flavor of descriptor it is.
-		    (if (not (keywordp (aref button 2)))
-			;; Simple style... just [ name callback activep ]
-			;; We ignore the 'suffix' entry, because that is what
-			;; the X code does.
-			(setq activep (aref button 2))
-		      (let ((ctr 2)
-			    (len (length button)))
-			(if (logand len 1)
-			    (error
-			     "Button descriptor has an odd number of keywords and values: %S"
-			     button))
-			(while (< ctr len)
-			  (if (eq (aref button ctr) :active)
-			      (setq activep (aref button (1+ ctr))
-				    ctr len))
-			  (setq ctr (+ ctr 2)))))
 		    (gtk-widget-set-sensitive (car buttons) (eval activep))
 		    
 		    ;; Apply the callback
 			     unread-command-events)
 		       (gtk-main-quit)
 		       t)
-		     (cons (aref button 1) dialog))
+		     (cons callback dialog))
 
 		    (gtk-widget-show (car buttons))
 		    (funcall (if flushrightp 'gtk-box-pack-end 'gtk-box-pack-start)
 
 ---------------------------------------------------------------------------
 
+For type `directory':
+
+The keywords allowed are
+
+:initial-directory
+  The initial directory to be selected in the dialog box (defaults to the
+  current buffer's `default-directory).
+:title
+  The title of the dialog box (defaults to \"Open\").
+
+---------------------------------------------------------------------------
+
 For type `print':
 
 This invokes the Windows standard Print dialog.
 		  (face-property-instance unfrobbed-face 'font domain))
 	   (set-face-property face 'font (vector frobbed-face) the-locale tags)))))))
 
+;; WE DEMAND FOUNDRY FROBBING!
+
+;; Family frobbing
+;; Thx Jan Vroonhof, Ref xemacs-beta <87oflypbum.fsf@petteflet.ntlworld.com>
+;; Brainlessly derived from make-face-size by Stephen; don't blame Jan.
+;; I'm long since flown to Rio, it does you little good to blame me, either.
+(defun make-face-family (face family &optional locale tags)
+  "Set FACE's family to FAMILY in LOCALE, if possible.
+
+Add/replace settings specified by TAGS only."
+  (frob-face-property face 'font
+		      ;; uses dynamic scope of family
+		      #'(lambda (f d)
+			  ;; keep the dependency on font.el for now
+			  (let ((fo (font-create-object (font-instance-name f)
+							d)))
+			    (set-font-family fo family)
+			    (font-create-name fo d)))
+		      nil locale tags))
+
+;; Style (ie, typographical face) frobbing
 (defun make-face-bold (face &optional locale tags)
   "Make FACE bold in LOCALE, if possible.
 This will attempt to make the font bold for X/MSW locales and will set the
      ([bold-italic] . [bold]))))
 
 
+;; Size frobbing
+;; Thx Jan Vroonhof, Ref xemacs-beta <87oflypbum.fsf@petteflet.ntlworld.com>
+;; Jan had a separate helper function 
+(defun make-face-size (face size &optional locale tags)
+  "Adjust FACE to SIZE in LOCALE, if possible.
+
+Add/replace settings specified by TAGS only."
+  (frob-face-property face 'font
+		      ;; uses dynamic scope of size
+		      #'(lambda (f d)
+			  ;; keep the dependency on font.el for now
+			  (let ((fo (font-create-object (font-instance-name f)
+							d)))
+			    (set-font-size fo size)
+			    (font-create-name fo d)))
+		      nil locale tags))
+
 ;; Why do the following two functions lose so badly in so many
 ;; circumstances?
 
     (mswindows . (mswindows-font-create-name mswindows-font-create-object))
     (pm        . (x-font-create-name x-font-create-object)) ; Change? FIXME
     (tty       . (tty-font-create-plist tty-font-create-object)))
-  "An assoc list mapping device types to the function used to create
-a font name from a font structure.")
+  "An assoc list mapping device types to a list of translations.
+
+The first function creates a font name from a font descriptor object.
+The second performs the reverse translation.")
 
 (defconst ns-font-weight-mappings
   '((:extra-light . "extralight")
 (defvar font-maximum-slippage "1pt"
   "How much a font is allowed to vary from the desired size.")
 
+;; Canonical (internal) sizes are in points.
+;; Registry
 (define-font-keywords :family :style :size :registry :encoding)
 
 (define-font-keywords
       w2))))
 
 (defun font-spatial-to-canonical (spec &optional device)
-  "Convert SPEC (in inches, millimeters, points, or picas) into points."
-  ;; 1 in = 6 pa = 25.4 mm = 72 pt
+  "Convert SPEC (in inches, millimeters, points, picas, or pixels) into points.
+
+Canonical sizes are in points.  If SPEC is null, nil is returned.  If SPEC is
+a number, it is interpreted as the desired point size and returned unchanged.
+Otherwise SPEC must be a string consisting of a number and an optional type.
+The type may be the strings \"px\", \"pix\", or \"pixel\" (pixels), \"pt\" or
+\"point\" (points), \"pa\" or \"pica\" (picas), \"in\" or \"inch\" (inches), \"cm\"
+(centimeters), or \"mm\" (millimeters).
+
+1 in = 2.54 cm = 6 pa = 25.4 mm = 72 pt.  Pixel size is device-dependent."
   (cond
    ((numberp spec)
     spec)
 	  (mm-width (float (or (device-mm-width device) 293)))
 	  (retval nil))
       (cond
+       ;; the following string-match is broken, there will never be a
+       ;; left operand detected
        ((string-match "^ *\\([-+*/]\\) *" spec) ; math!  whee!
 	(let ((math-func (intern (match-string 1 spec)))
 	      (other (font-spatial-to-canonical
 	  (plist-get args :encoding)))
 
 (defun font-create-name (fontobj &optional device)
+  "Return a font name constructed from FONTOBJ, appropriate for DEVICE."
   (let* ((type (device-type device))
 	 (func (car (cdr-safe (assq type font-window-system-mappings)))))
     (and func (fboundp func) (funcall func fontobj device))))
 
 ;;;###autoload
 (defun font-create-object (fontname &optional device)
+  "Return a font descriptor object for FONTNAME, appropriate for DEVICE."
   (let* ((type (device-type device))
 	 (func (car (cdr (cdr-safe (assq type font-window-system-mappings))))))
     (and func (fboundp func) (funcall func fontname device))))
 ;;; The window-system dependent code (TTY-style)
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (defun tty-font-create-object (fontname &optional device)
+  "Return a font descriptor object for FONTNAME, appropriate for TTY devices."
   (make-font :size "12pt"))
 
 (defun tty-font-create-plist (fontobj &optional device)
+  "Return a font name constructed from FONTOBJ, appropriate for TTY devices."
   (list
    (cons 'underline (font-underline-p fontobj))
    (cons 'highlight (if (or (font-bold-p fontobj)
   "A list of font family mappings on X devices.")
 
 (defun x-font-create-object (fontname &optional device)
+  "Return a font descriptor object for FONTNAME, appropriate for X devices."
   (let ((case-fold-search t))
     (if (or (not (stringp fontname))
 	    (not (string-match font-x-font-regexp fontname)))
   (font-size (font-default-object-for-device (or device (selected-device)))))
 
 (defun x-font-create-name (fontobj &optional device)
+  "Return a font name constructed from FONTOBJ, appropriate for X devices."
   (if (and (not (or (font-family fontobj)
 		    (font-weight fontobj)
 		    (font-size fontobj)
 	    (sort (font-unique (nconc scaled normal)) 'string-lessp))))))
 
 (defun ns-font-create-name (fontobj &optional device)
+  "Return a font name constructed from FONTOBJ, appropriate for NextSTEP devices."
   (let ((family (or (font-family fontobj)
 		    (ns-font-families-for-device device)))
 	(weight (or (font-weight fontobj) :medium))
   "A list of font family mappings on mswindows devices.")
 
 (defun mswindows-font-create-object (fontname &optional device)
+  "Return a font descriptor object for FONTNAME, appropriate for MS Windows devices."
   (let ((case-fold-search t)
 	(font (mswindows-font-canonicalize-name fontname)))
     (if (or (not (stringp font))
 	retval))))
 
 (defun mswindows-font-create-name (fontobj &optional device)
+  "Return a font name constructed from FONTOBJ, appropriate for MS Windows devices."
   (if (and (not (or (font-family fontobj)
 		    (font-weight fontobj)
 		    (font-size fontobj)

lisp/gtk-faces.el

   (if (not (eq (device-type device) 'gtk))
       nil
     (gtk-init-pointers)
-    '(let* ((style (gtk-style-info device))
+    (let* ((style (gtk-style-info device))
 	   ;;(normal 0)			; GTK_STATE_NORMAL
 	   ;;(active 1)			; GTK_STATE_ACTIVE
 	   (prelight 2)			; GTK_STATE_PRELIGHT
 	 :activate-callback 'read-file-name-activate-callback)
 	(goto-char (point-min) completion-buf)))))
 
-(defun read-file-name-1 (history prompt dir default
-				 must-match initial-contents
-				 completer)
+(defun read-file-name-1 (type history prompt dir default
+			      must-match initial-contents
+			      completer)
   (if (should-use-dialog-box-p)
       (condition-case nil
 	  (let ((file
 		 (apply #'make-dialog-box
-			'file `(:title ,(capitalize-string-as-title
-					 ;; Kludge: Delete ": " off the end.
-					 (replace-in-string prompt ": $" ""))
-				       ,@(and dir (list :initial-directory
-							dir))
-				       :file-must-exist ,must-match
-				       ,@(and initial-contents
-					      (list :initial-filename
-						    initial-contents))))))
+			type `(:title ,(capitalize-string-as-title
+					;; Kludge: Delete ": " off the end.
+					(replace-in-string prompt ": $" ""))
+				      ,@(and dir (list :initial-directory
+						       dir))
+				      :file-must-exist ,must-match
+				      ,@(and initial-contents
+					     (list :initial-filename
+						   initial-contents))))))
 	    ;; hack -- until we implement reading a directory properly,
 	    ;; allow a file as indicating the directory it's in
 	    (if (and (eq completer 'read-directory-name-internal)
 Sixth arg HISTORY specifies the history list to use.  Default is
  `file-name-history'.
 DIR defaults to current buffer's directory default."
-  (read-file-name-1
-   (or history 'file-name-history)
+  (read-file-name-1 
+   'file (or history 'file-name-history)
    prompt dir (or default
 		  (and initial-contents
 		       (abbreviate-file-name (expand-file-name
  `file-name-history'.
 DIR defaults to current buffer's directory default."
   (read-file-name-1
-    (or history 'file-name-history)
-    prompt dir (or default default-directory) must-match initial-contents
-    'read-directory-name-internal))
+   'directory (or history 'file-name-history)
+   prompt dir (or default default-directory) must-match initial-contents
+   'read-directory-name-internal))
 
 
 ;; Environment-variable and ~username completion hack

lisp/package-get.el

 is non-nil."
   (or (package-get-locate-file package-get-base-filename t no-remote)
       (if (file-exists-p package-get-user-index-filename)
-	  package-get-user-index-filename)))
+	  package-get-user-index-filename)
+      (locate-data-file package-get-base-filename)
+      (error "Can't locate a package index file.")))
 
 (defun package-get-maybe-save-index (filename)
   "Offer to save the current buffer as the local package index file,

lisp/package-net.el

 ;;
 ;; 3. For package releases that's all you need to do. For binary
 ;; releases you need to build both cygwin and win32 binaries and put
-;; them in appropriate tarballs:
+;; them in appropriate tarballs: This can be achieved by running
+;; build-msw-release.sh
 ;;
-;; For cygwin, configure, make and install and then do (this is for
-;; 21.1.13):
-;;
-;;   cd <install dir>
-;;   tar cvzf xemacs-i686-pc-cygwin32-21.1.13.tar.gz \
-;;      ./bin/i686-pc-cygwin32 ./lib/xemacs-21.1.13 \
-;;      ./lib/xemacs/lock ./man/man1/xemacs.1 \
-;;      ./man/man1/ctags.1 ./man/man1/gnu*.1'
-;;
-;;  Note that the naming of the package is important. Don't be tempted
-;;  to change the order in any way.
-;;
-;; For win32 build and install the release and then (again for
-;; 21.1.13):
-;;
-;;   cd <install dir>
-;;   tar cvzf xemacs-i386-pc-win32-21.1.13.tar.gz ./XEmacs-21.1.13
-;; 
-;; The binaries should be uploaded to
-;; `ftp://ftp.xemacs.org/pub/xemacs/binaries/cygwin32' and
-;; `ftp://ftp.xemacs.org/pub/xemacs/binaries/win32' respectively. Take
-;; a note of their sizes and set `package-net-cygwin32-binary-size'
-;; and `package-net-win32-binary-size' appropriately in this file and
-;; then follow step 2.
 
 (require 'package-admin)
 (require 'package-get)
 ;;
 ;; 2. Generating setup.ini should be more automatic.
 
-(defvar package-net-cygwin32-binary-size 7559692
+(defvar package-net-cygwin32-binary-size 0
   "The size in bytes of the cygwin32 binary distribution.")
 
-(defvar package-net-win32-binary-size 7421788
+(defvar package-net-win32-binary-size 0
   "The size in bytes of the win32 binary distribution.")
 
+(defvar package-net-setup-version "1.0"
+  "The version string of setup.")
+
 ;;;###autoload
 (defun package-net-setup-directory ()
   (file-truename (concat data-directory "../../" (if (eq system-type 'cygwin32)
 	  (write-region (point-min) (point-max) (concat destdir "setup.ini")))
       (kill-buffer buf))))
 
-(defun package-net-generate-bin-ini (&optional destdir version)
-  "Convert the package index to ini file format in DESTDIR.
-DESTDIR defaults to the value of `data-directory'."
-
-  (setq destdir (file-name-as-directory (or destdir data-directory)))
+(defun package-net-generate-bin-ini (&optional version)
+  "Convert the package index to ini file format in the current directory."
   (let ((buf (get-buffer-create "*setup-bin.ini*")))
     (unwind-protect
         (save-excursion
 			  (+ (* (car (current-time)) 65536) (car (cdr (current-time))))))
 	  (insert (format "setup-version: %s\n\n" (or version "1.0")))
 	  ;; Native version
-	  (insert (format "@ %s\n" "xemacs-i386-pc-win32"))
+	  (insert (format "@ %s\n" "xemacs-i586-pc-win32"))
 	  (insert (format "version: %s\n" emacs-program-version))
 	  (insert "type: native\n")
 	  (insert (format "install: win32/%s %d\n\n"
 				  emacs-program-version ".tar.gz") 
 			  package-net-cygwin32-binary-size))
 	  (insert "# setup.ini file ends here\n")
-	  (write-region (point-min) (point-max) (concat destdir "setup-bin.ini")))
-      (kill-buffer buf))))
+	  (write-region (point-min) (point-max) "setup-bin.ini")))
+    (kill-buffer buf)))
 
 (defun package-net-batch-generate-bin-ini ()
   "Convert the package index to ini file format."
   (unless noninteractive
     (error "`package-net-batch-generate-bin-ini' is to be used only with -batch"))
-  (let ((dir (car command-line-args-left))
-	(version (car (cdr command-line-args-left))))
-    (package-net-generate-bin-ini dir version)))
+  (package-net-generate-bin-ini package-net-setup-version))
 
 ;;;###autoload
 (defun package-net-update-installed-db (&optional destdir)

lisp/toolbar-items.el

                 (function :tag "Other"))
   :group 'toolbar)
 
-(defun toolbar-dired ()
-  (interactive)
-  (call-interactively toolbar-dired-function))
+(defun toolbar-dired (dir)
+  (interactive "DDired directory: ")
+  (funcall toolbar-dired-function dir))
 
 (defcustom toolbar-save-function 'save-buffer
   "*Function to call when the save icon is selected."
+man/ChangeLog
+2001-12-15  Stephen J. Turnbull  <stephen@xemacs.org>
+
+	* lispref/packaging.texi (The User's View):
+	Correct description of man subdirectory.
+
+	(The Package Release Engineer's View):
+	(package-compile.el):
+	Change hazmat to useful documentation.
+
+	(Issues):
+	Hazmat removal.
+
+2001-11-27  Stephen J. Turnbull  <stephen@xemacs.org>
+
+	* lispref/packaging.texi: New file.
+	* lispref/lispref.texi (Top): Add Packaging & subnodes to menus.
+	Include packaging.texi.
+	* lispref/intro.texi (Introduction): Next -> Packaging.
+	* lispref/objects.texi (Lisp Data Types): Previous -> Packaging.
+	* Makefile (lispref-srcs): Depend on lispref/packaging.texi.
+	
 2001-10-23  Stephen J. Turnbull  <stephen@xemacs.org>
 
 	* XEmacs 21.4.5 "Civil Service" is released.
 	lispref/numbers.texi \
 	lispref/objects.texi \
 	lispref/os.texi \
+	lispref/packaging.texi \
 	lispref/positions.texi \
 	lispref/processes.texi \
 	lispref/range-tables.texi \

man/lispref/glyphs.texi

 * Redisplay Glyphs::    Glyphs controlling various redisplay functions.
 * Subwindows::          Inserting an externally-controlled subwindow
                           into a buffer.
+* Glyph Examples::      Examples of how to work with glyphs.
 @end menu
 
 @node Glyph Functions
 @defun subwindowp object
 This function returns non-@code{nil} if @var{object} is a subwindow.
 @end defun
+
+@node Glyph Examples
+@section Glyph Examples
+
+For many applications, displaying graphics is a simple process: you
+create a glyph, and then you insert it into a buffer.
+
+The easiest way to create a glyph is to use a file that contains a
+graphical image, such as a JPEG, TIFF, or PNG file:
+
+@lisp
+;; Create a glyph from a JPEG file:
+(setq foo (make-glyph [jpeg :file "/tmp/file1.jpg"]))
+@end lisp
+
+@lisp
+;; Create a glyph from a XPM file:
+(setq foo (make-glyph [xpm :file "/tmp/file2.xpm"]))
+@end lisp
+
+@lisp
+;; Create a glyph from a PNG file:
+(setq foo (make-glyph [png :file "/tmp/file3.png"]))
+@end lisp
+
+@lisp
+;; Create a glyph from a TIFF file:
+(setq foo (make-glyph [tiff :file "/tmp/file4.tiff"]))
+@end lisp
+
+The parameters passed to @code{make-glyph} are called "Image
+Specifiers", and can handle more image types than those shown above.
+You can also put the raw image data into a string (e.g., if you put the
+contents of a JPEG file into a string), and use that to create a glyph.
+@xref{Image Specifiers}, for more information.
+
+@quotation
+@strong{Caution}: In order for XEmacs to read a particular graphics file
+format, support for that format must have been compiled into XEmacs.
+It's possible, although somewhat unlikely, for XEmacs to have been
+compiled without support for any of the various graphics file formats.
+To see what graphics formats your particular version of XEmacs supports,
+use @kbd{M-x describe-installation}.
+
+To programmatically query whether or not a particular file format is
+supported, you can use the @code{featurep} function, with one of:
+@code{gif}, @code{tiff}, @code{jpeg}, @code{xpm}, @code{xbm},
+@code{png}, or @code{xface}.  For an up-to-date list, @ref{Image
+Specifiers}.  Example:
+
+@example
+;; Returns `t' if TIFF is supported:
+(featurep 'tiff)
+@end example
+
+Another example is:
+
+@example
+;; Returns a list of `t' or `nil', depending on whether or not the
+;; corresponding feature is supported:
+(mapcar #'(lambda (format-symbol) (featurep format-symbol))
+        '(gif tiff jpeg xpm png))
+@end example
+
+@end quotation
+
+Once you have a glyph, you can then insert it into a buffer.  Example:
+
+@lisp
+;; Use this function to insert a glyph at the left edge of point in the
+;; current buffer.  Any existing glyph at this location is replaced.
+(defun insert-glyph (gl)
+  "Insert a glyph at the left edge of point."
+  (let ( (prop 'myimage)        ;; myimage is an arbitrary name, chosen 
+                                ;; to (hopefully) not conflict with any
+                                ;; other properties.  Change it if
+                                ;; necessary.
+         extent )
+    ;; First, check to see if one of our extents already exists at
+    ;; point.  For ease-of-programming, we are creating and using our
+    ;; own extents (multiple extents are allowed to exist/overlap at the
+    ;; same point, and it's quite possible for other applications to
+    ;; embed extents in the current buffer without your knowledge).
+    ;; Basically, if an extent, with the property stored in "prop",
+    ;; exists at point, we assume that it is one of ours, and we re-use
+    ;; it (this is why it is important for the property stored in "prop"
+    ;; to be unique, and only used by us).
+    (if (not (setq extent (extent-at (point) (current-buffer) prop)))
+      (progn
+        ;; If an extent does not already exist, create a zero-length
+        ;; extent, and give it our special property.
+        (setq extent (make-extent (point) (point) (current-buffer)))
+        (set-extent-property extent prop t)
+        ))
+    ;; Display the glyph by storing it as the extent's "begin-glyph".
+    (set-extent-property extent 'begin-glyph gl)
+    ))
+
+;; You can then use this function like:
+(insert-glyph (make-glyph [jpeg :file "/tmp/file1.jpg"]))
+;; This will insert the glyph at point.
+
+;; Here's an example of how to insert two glyphs side-by-side, at point
+;; (using the above code):
+(progn
+  (insert-glyph (make-glyph [jpeg :file "/tmp/file1.jpg"]))
+  ;; Create a new extent at point.  We can't simply call "insert-glyph",
+  ;; as "insert-glyph" will simply replace the first glyph with the
+  ;; second.
+  (setq extent (make-extent (point) (point) (current-buffer)))
+  ;; Here, we're only setting the 'myimage property in case we need
+  ;; to later identify/locate/reuse this particular extent.
+  (set-extent-property extent 'myimage t)
+  (set-extent-property extent 'begin-glyph
+                       (make-glyph [jpeg :file "/tmp/file2.jpg"]))
+  )
+
+@end lisp
+
+Here are the gory details:
+
+@itemize @bullet
+
+@item
+Glyphs are displayed by attaching them to extents (see @ref{Extents}),
+either to the beginning or the end of extents.
+
+Note that extents can be used for many things, and not just for
+displaying images (although, in the above example, we are creating our
+own extent for the sole purpose of displaying an image).  Also, note
+that multiple extents are allowed to exist at the same position, and
+they can overlap.
+
+@item
+Glyphs are often displayed inside the text area (alongside text).  This
+is the default.
+
+Although glyphs can also be displayed in the margins, how to do this
+will not be described here.  For more information on this, see
+@ref{Annotation Basics} (look for information on "layout types") and
+@ref{Extent Properties} (look for @code{begin-glyph-layout} and
+@code{end-glyph-layout}).
+
+@item
+The easiest way to insert a glyph into text is to create a zero-length
+extent at the point where you want the glyph to appear.
+
+Note that zero-length extents are attached to the character to the
+right of the extent; deleting this character will also delete the extent.
+
+@item
+It's often a good idea to assign a unique property to the newly-created
+extent, in case you later want to locate it, and replace any existing
+glyph with a different one (or just delete the existing one).  In the
+above example, we are using "myimage" as our (hopefully) unique property
+name.
+
+If you need to locate all of the extents, you'll have to use functions
+like @code{extent-list} or @code{next-extent}, or provide additional
+parameters to the @code{extent-at} function.  Assigning a unique
+property to the extent makes it easy to locate your extents; for
+example, @code{extent-list} can return only those extents with a
+particular property.  @xref{Finding Extents}, and @ref{Mapping Over
+Extents}, for more information.
+
+@item
+Glyphs are displayed by assigning then to the @code{begin-glyph} or
+@code{end-glyph} property of the extent.  For zero-length extents, it
+doesn't really matter if you assign the glyph to the @code{begin-glyph}
+or @code{end-glyph} property, as they are both at the same location;
+however, for non-zero-length extents (extents that cover one or more
+characters of text), it does matter which one you use.
+
+Assigning @code{nil} to the @code{begin-glyph} or @code{end-glyph}
+property will delete any existing glyph.  In this case, you may also
+want to delete the extent, assuming that the extent is used for no other
+purpose.
+
+@item
+If you happen to insert two glyphs, side-by-side, note that the example
+@code{insert-glyph} function will have trouble, if it's again used at
+the same point (it can only locate one of the two extents).
+@xref{Finding Extents}, and @ref{Mapping Over Extents}, for more
+information on locating extents in a buffer.
+
+@item
+Among other things, glyphs provide a way of displaying graphics
+alongside text.  Note, however, that glyphs only provide a way of
+displaying graphics; glyphs are not actually part of the text, and are
+only displayed alongside the text.  If you save the text in the buffer,
+the graphics are not saved.  The low-level glyph code does not provide a
+way of saving graphics with the text.  If you need to save graphics and
+text, you have to write your own code to do this, and this topic is
+outside the scope of this discussion.
+
+@end itemize

man/lispref/intro.texi

 library.  If this is what you want to do, use the GNU Library General
 Public License instead of this License.
 
-@node Introduction, Lisp Data Types, Copying, Top
+@node Introduction, Packaging, Copying, Top
 @chapter Introduction
 
   Most of the XEmacs text editor is written in the programming

man/lispref/lispref.texi

 * Copying::                 Conditions for copying and changing XEmacs.
 * Introduction::            Introduction and conventions used.
 
+* Packaging::               Lisp library administrative infrastructure.
+
 * Lisp Data Types::         Data types of objects in XEmacs Lisp.
 * Numbers::                 Numbers and arithmetic functions.
 * Strings and Characters::  Strings, and functions that work on them.
 * A Sample Function Description::
 * A Sample Variable Description::
 
+Packaging
+
+* Package Overview::       Lisp Libraries and Packages.
+* Package Terminology::    Basic stuff.
+* Building Packages::      Turn packaged source into a tarball.
+* Local.rules File::       Tell the XEmacs Packaging System about your host.
+* Creating Packages::      Tell the XEmacs Packaging System about your package.
+* Issues::
+
+Package Overview
+
+* The User's View::
+* The Library Maintainer's View::
+* The Package Release Engineer's View::
+
+The Library Maintainer's View
+
+* Infrastructure::    Global Makefiles and common rules.
+* Control Files::     Package-specific Makefiles and administrative files.
+* Obtaining::         Obtaining the XEmacs Packaging System and utilities.
+
+Creating Packages
+
+* package-compile.el::
+* package-info.in Fields::
+* Makefile Variables::
+* Makefile Targets::
+
 Lisp Data Types
 
 * Printed Representation::  How Lisp objects are represented as text.
 * Redisplay Glyphs::    Glyphs controlling various redisplay functions.
 * Subwindows::          Inserting an externally-controlled subwindow
                           into a buffer.
+* Glyph Examples::      Examples of how to work with glyphs.
 
 Glyph Functions
 
 @end menu
 
 @include intro.texi
+@include packaging.texi
 @include objects.texi
 @include numbers.texi
 @include strings.texi

man/lispref/objects.texi

 @c Copyright (C) 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
 @c See the file lispref.texi for copying conditions.
 @setfilename ../../info/objects.info
-@node Lisp Data Types, Numbers, Introduction, Top
+@node Lisp Data Types, Numbers, Packaging, Top
 @chapter Lisp Data Types
 @cindex object
 @cindex Lisp object

man/lispref/packaging.texi

+@c -*-texinfo-*-
+@c This is part of the XEmacs Lisp Reference Manual.
+@c Copyright (C) 2001 Free Software Foundation, Inc.
+@c See the file lispref.texi for copying conditions.
+
+@setfilename ../../info/packaging.info
+
+@c Macro to make formatting of the XEmacs pms name consistent.
+@c Maybe @sc looks OK in HTML?  If so, condition on Info.
+@iftex
+@macro xpms
+XE@sc{macs} Packaging System
+@end macro
+@end iftex
+@ifnottex
+@macro xpms
+XEmacs Packaging System
+@end macro
+@end ifnottex
+
+@node Packaging, Lisp Data Types, Introduction, Top
+@chapter The @xpms{}
+@cindex package
+@cindex packaging
+
+The XEmacs distribution, starting with version 21, comes only with a
+very basic set of built-in modes and libraries.  Most of the libraries
+that were part of the distribution of earlier versions of XEmacs are now
+available separately.  The user as well as the system administrator can
+choose which packages to install; the actual installation process is
+easy.  This gives an installer the ability to tailor an XEmacs
+installation for local needs with safe removal of unnecessary code.
+
+This chapter describes how to package Lisp libraries for use with the
+@xpms{}.
+
+@emph{Please note carefully} that the term @dfn{package} as used in
+XEmacs refers to an aggregation of Lisp code and/or data distributed as
+a unit.  It does not, as it does in many Lisps, refer to a way of
+creating separate name spaces.  XEmacs has no facility for providing
+separate name spaces.  (If we ever do get separate name spaces, we'll
+probably regret overloading the nomenclature in this way, but it's
+become established.)
+
+@menu
+Introduction:
+* Package Overview::       Lisp Libraries and Packages.
+
+Packaging Lisp Libraries:
+* Package Terminology::    Basic stuff.
+* Building Packages::      Turn packaged source into a tarball.
+* Local.rules File::       Tell the @xpms{} about your host.
+* Creating Packages::      Tell the @xpms{} about your package.
+@c * History::                     History of the @xpms{}
+@c * Installation::                Installing the @xpms{} with your (X)Emacs.
+@c * Configuration::               Configuring the @xpms{} for use.
+@c * Usage::                       An overview of the operation of the @xpms{}.
+@c * Bug Reports::                 Reporting Bugs and Problems
+@c * Frequently Asked Questions::  Questions and answers from the mailing list.
+
+Internals and Package Release Engineering:
+* Issues::                      
+@end menu
+
+@node Package Overview, Package Terminology, , Packaging
+@chapter An overview of the @xpms{}
+
+The @xpms{} is a system for administering the installation, upgrade, and
+removal of Lisp libraries.  For the end user, it provides facilities for
+determining availability of packages and which versions at remote
+sites.  It will download and automatically install a package, ensuring
+that any old files from previous versions of the package are removed
+first.  By providing a standard set of hierarchies for installation, it
+makes configuration of XEmacs simpler.  Furthermore, packages normally
+provide ancillary auto-autoloads and custom-loads libraries, which are
+automatically detected and loaded by XEmacs upon startup.  This means
+that once installed, all facilities of package, including autoloading
+the library upon invocation of a command provided by the library and
+convenient configuration and customization, are automatically available
+to the user.  There is no need to add autoloads or keybindings to in the
+init file, and structured configuration of the package is available
+through the Customize system even before the libraries are loaded.
+
+All of this convenience comes at a cost.  The cost of administration at
+the package level is negligible compared to the benefits, of course.
+However, the requirement that XEmacs find and load auto-autoloads and
+custom-loads libraries comes at a fairly large cost in startup time.  In
+order to reduce this cost, XEmacs imposes fairly strict conditions on
+the structure of an installed package.
+
+Meeting these requirements, as well as simply providing the
+auto-autoloads and the information about availability and so on does
+impose some costs on the library maintainer.  The @xpms{} also provides
+structure and utilities to the library maintainer to make these tasks
+easier.  This manual documents the requirements and the tools that the
+@xpms{} provides to ensure that a package satisfies them.
+
+@menu
+* The User's View::
+* The Library Maintainer's View::
+* The Package Release Engineer's View::
+@end menu
+
+
+@node The User's View, The Library Maintainer's View, , Package Overview
+@section The User's View
+
+@strong{N.B.}  Much of the discussion in this section undoubtedly
+belongs elsewhere, @ref{Packages,,,xemacs}.
+
+From the user's point of view, an XEmacs binary package is simply a
+standard tarball (usually gzipped) containing Lisp sources, compiled
+Lisp, documentation, and possibly data files or supporting executables.
+The tarball is unpacked using standard tools such as GNU tar and gzip.
+The package system does impose certain requirements for automatic
+configuration to work.
+
+Here the main consideration is that the tarball ``expects'' to be
+unpacked from the top of a package hierarchy.  A @dfn{package hierarchy}
+is basically an image of a classic Emacs ``run-in-place'' tree, with
+@file{lisp}, @file{etc}, @file{info}, @file{man}, @file{lib-src}, and
+@file{pkginfo} subdirectories of the top.  The @file{pkginfo}
+subdirectory is for use by the @xpms{} administration tools, and
+currently contains a @file{MANIFEST.@var{package-name}} file for each
+package to ensure that no cruft remains when a package is removed or
+updated.  The @file{lisp}, @file{etc}, and @file{lib-src} subdirectories
+are further subdivided, with a subdirectory for each package.  The
+@file{info} directory obeys the usual conventions.
+@emph{I.e.}, the @file{info} directory is flat
+with a(n) (optional) @file{dir} file and one (set of) info file(s) per
+package.  The @file{man} subdirectory typically contains documentation
+sources, separated by package.  (It does not contain @file{man(1)}
+pages, as Emacs provides very few of them.)
+
+There are several standard package hierarchies, and administrators can
+configure others at build time, while users can configure others at run
+time.  The standard system hierarchies are all subdirectories of an
+@c #### This is possibly incorrect usage of "installation root."
+XEmacs installation root, typically @file{/usr/local/lib/xemacs/}.
+These are the @file{xemacs-packages}, @file{mule-packages},
+@file{infodock-packages}, and @file{site-packages} hierarchies.  Each
+has the structure described above, but the purposes differ.  The
+@file{xemacs-packages} is the normal place for installing ``official''
+packages and many third-party libraries.  Unfortunately, it is not yet
+quite possible to read libraries containing international characters
+with a non-Mule XEmacs, so such libraries are sequestered in the
+@file{mule-packages} hierarchy.  Some packages are compatible only with
+the Infodock development environment, and they will be installed in the
+@file{infodock-packages} hierarchy.  The @file{site-packages} hierarchy
+is for packages not distributed by XEmacs.org, typically locally
+developed.
+
+Packages are in principle supposed to be XEmacs version-independent, but
+if such dependencies are unavoidable, additional standard package
+hierarchies may be installed under version directories, @emph{e.g.}
+@file{/usr/local/lib/xemacs-21.4.6/}.
+
+Users who do not have sufficient privilege to install packages in the
+system hierarchies may install package hierarchies under
+@file{~/.xemacs}.  At present only the @file{xemacs-packages} and
+@file{mule-packages} hierarchies are supported, but it might make sense
+to extend this to support @file{infodock-packages} and
+@file{site-packages} hierarchies in the future.
+
+The package hierarchies are not searched directly for libraries to be
+loaded; this would be very costly.  Instead, the hierarchies are ordered
+according to certain rules, and searched for package lisp directories at
+invocation.  These directories are added to the general
+@code{load-path}.  As usual, it is @code{load-path} that is searched at
+run-time.  This approach is somewhat costly at initialization, but
+results in a very ``clean'' @code{load-path}.
+
+The order of search can be changed at build time by specifying the
+@samp{--package-path} option to @file{configure}, or at run-time by
+specifying the @code{EMACSPACKAGEPATH} environment variable.
+@xref{Packages,,,xemacs}.
+
+@c #### The following description is quite possibly inaccurate.
+@c Please, Michael, write some specs up!
+The default order of search is hierarchically determined.  First, the
+roots are ordered.  The @dfn{early} roots are the user-specific roots,
+typically @file{~/.xemacs}.  The @dfn{late} roots are the system roots,
+typically @file{/usr/local/lib/xemacs-21.4.6} and
+@file{/usr/local/lib/xemacs}, in that order.  All hierarchies for a
+given root are searched for package Lisp directories, which are appended
+to @code{load-path} in the order found.  Then the search proceeds to the
+next root, whose results will be appended to the @code{load-path}
+generated by previous roots.
+
+Second, the hierarchies below each root are searched in the order
+@file{site-packages}, @file{infodock-packages}, @file{mule-packages},
+then @file{xemacs-packages}.
+
+In each hierarchy there should be a @file{lisp} subdirectory, containing
+directories named for the packages.  Each package's Lisp libraries thus
+are contained in a directory of the form
+@var{root}/@var{hierarchy}/lisp/@var{package}/.
+
+With such a complex search algorithm, the possibility of libraries being
+shadowed by another library with the same name is quite real.  There are
+two considerations here.  First, every XEmacs package contains certain
+libraries with constant names.  These are
+
+@table @file
+@item _pkg.el
+Lisp code to inform the package administration system about the package
+
+@item auto-autoloads.el
+Lisp code to set up autoloaded functions and variables that may be
+needed at load time
+
+@item custom-load.el
+definitions of configuration variables for use with the Customize
+system.
+@end table
+
+They are special-cased, because the way they are used prevents shadowing
+from being an issue.
+
+Second, it is possible that multiple copies of some library, or
+different libraries with the same name, are installed in various places
+in the hierarchies.  To detect such shadows, use
+@code{list-load-path-shadows}.
+
+Finally, note that most basic Emacs functionality, including most of the
+Lisp API, is implemented in Lisp libraries.  Because they use internal
+reserved APIs that are subject to change according the needs of the
+developers, these libraries are distributed with the XEmacs binary, and
+are called @dfn{core Lisp libraries}.  Most core Lisp libraries are
+``preloaded'' into the Emacs binary and in normal usage are never
+explicitly loaded.  However, they can be explicitly loaded, and if so
+they are searched on @code{load-path}.
+@c #### Is this correct?  It is not for C-h f, for example.
+Furthermore, functions such as @code{locate-library} will also search on
+the @code{load-path}.  The searching takes place under somewhat
+different rules from those used for packaged Lisp.  It is probably
+easiest to think of the package hierarchy searching algorithm as
+receiving a @code{load-path} initialized to the core Lisp directories.
+
+
+@node The Library Maintainer's View, The Package Release Engineer's View, The User's View, Package Overview
+@section The Library Maintainer's View
+
+From the library maintainer's viewpoint, the advantages to the @xpms{}
+stem from the convenience to the user of installation and upgrade.
+Since an installed package automatically registers its entry points via
+autoload and its configuration variables with the Customize system,
+configuration FAQs are reduced.  When it's easy to upgrade, users learn
+to try @samp{Tools | Packages | Update Installed Packages} before
+posting a FAQ whose answer is ``long since fixed, please upgrade.''
+
+This comes at some cost, as the library maintainer needs to arrange that
+the package be installed in a directory structure that satisfies the
+requirements of the @xpms{}.  Autoload cookies and defcustoms must also
+be added to existing libraries.  The @xpms{} provides infrastructure to
+assure that all of these annoyances need only be dealt with once.  The
+autoload cookies and defcustoms are beyond the scope of this chapter, but
+most maintainers of modern packages are already familiar with these
+mechanisms.
+
+The @xpms{} may be divided into the @dfn{infrastructure} common to all
+packages, and the package-specific @dfn{control files}.  The
+infrastructure supports global builds, installation, and generation of
+the ``sumo'' bundles of packages, as well as generation of individual
+packages.  The package control files describe the structure of the
+package's source tree and provide administrative information.
+
+@menu
+* Infrastructure::    Global Makefiles and common rules.
+* Control Files::     Package-specific Makefiles and administrative files.
+* Obtaining::         Obtaining the @xpms{} and required utilities.
+@end menu
+
+@node Infrastructure, Control Files, , The Library Maintainer's View
+@subsection Infrastructure
+
+In order to get the greatest benefit from the @xpms{}, a library
+maintainer should place the package sources in an appropriate place in
+the XEmacs source package hierarchy, and arrange to have the source
+package imported into the XEmacs CVS repository.
+@c #### the parenthetical remark should go to "issues."
+(We realize that the
+latter requirement can be quite burdensome.  We are working on ways to
+remove this requirement, but for the present it remains necessary.)  The
+library maintainer must also keep sources for any packages his/her
+package requires.  This requirement is somewhat burdensome, but unlikely
+to be relaxed because of the implementation of compilation of macros in
+Emacs Lisp.  Macros cannot be called by compiled Lisp (the macro
+expansion, which is always known at compile time, is inlined), so the
+source of the macro must be loaded before compiling the called function.
+
+The source package hierarchy may be rooted anywhere.  The CVS module is
+called ``packages,'' so we will refer to the top directory of the source
+package hierarchy as ``the @file{packages} directory.''  The
+@file{packages} directory contains two source subdirectories,
+@file{xemacs-packages} and @file{mule-packages} (for convenience in
+segregating the packages which depend on Mule, as they will cause
+load-time errors in a non-Mule XEmacs).  Each subdirectory contains many
+package source directories, whose internal structure is not specified.
+That structure is left up to the convenience of the library maintainers.
+The requirements on the top directory of an individual package source
+tree are given below, @ref{Control Files}.
+
+The @file{packages} directory contains some auxiliary Lisp libraries
+used in the compilation and packaging process.  The content of these
+libraries is of interest primarily to the packaging engineers, @ref{The
+Package Release Engineer's View}.
+
+Finally, the @file{packages}, @file{packages/xemacs-packages}, and
+@file{packages/mule-packages} directories contain @file{Makefile}s and
+include files to control the package creation process.  The
+@file{Makefile}s in @file{packages/xemacs-packages} and
+@file{packages/mule-packages} simply define the default sets of known
+packages and include @file{../iterate.rules}, which implements recursive
+building of all target packages.
+
+The @samp{make} infrastructure in @file{packages} includes
+
+@table @file
+@item Makefile
+controls building of individual packages, local installation, and
+bundling of ``sumo'' tarballs
+
+@item iterate.rules
+controls recursive builds of multiple packages
+
+@item XEmacs.rules
+provides the rules for building and packaging.  Included by all package
+@file{Makefile}s.
+
+@item Local.rules
+provides local configuration, such as installation targets and staging
+directories, as well as a number of kludges (many now obsolete) required
+for building packages on the Windows platform.
+
+@item Local.rules.template
+a template for Local.rules, liberally commented
+
+@item Local.rules.mk
+consistency checking for @file{Local.rules}, included by both the
+top-level @file{Makefile} and by @file{XEmacs.rules}.
+
+@c #### Add to "issues"
+@item package-compile.el
+compile environment (@emph{e.g.}, load-path) setup.  It is very bogus
+that this is here, an alternative mechanism is likely to be provided.
+@end table
+
+Of these, only @file{Local.rules} and @file{package-compile.el} need to
+be modified by the library maintainer.  The changes to Local.rules
+affect only your environment.  This should need to be done only once
+when first preparing the source environment.  The necessary
+modifications to @file{package-compile.el} need to be done for each
+package and are discussed in the next section, @ref{Control Files}.
+
+
+@node Control Files, Obtaining, Infrastructure, The Library Maintainer's View
+@subsection Control Files
+
+Each package source must contain a number of control files in the
+top-level directory.  These files in general can be created and then
+ignored, except for a few variables that need to be updated when new
+versions are released.  In most cases even adding, renaming, and
+removing library source files can be handled by generic rules.
+
+The package control files include
+
+@table @file
+@item Makefile
+Must set a few @file{make} variables used by the administrative
+utilities, and defines a couple of package-building targets to depend on
+appropriate targets defined generically in @file{XEmacs.rules}.  It may
+also provide various variables and rules to transform the source tree
+structure into that expected by the run-time system.
+
+@item package-info.in
+Provides a template for package information to be provided to the
+administrative utilities.  Static variables that are rarely changed
+(such as the package's name) are entered as literals.  Some variables
+are generated by the build process (build dates and MD5 checksums) and
+are automatically filled in.  Finally, some variables that change
+irregularly (dependences and even version numbers) are set as
+@file{make} variables in the @file{Makefile}.
+
+@item ChangeLog
+Not strictly required, but normally a ChangeLog will be added by the
+XEmacs package maintainer if different from the upstream maintainer.
+
+@item package-compile.el
+compile environment (@emph{e.g.}, load-path) setup.  It is very bogus
+that this is here, an alternative mechanism is likely to be provided.
+
+@item _pkg.el
+Generated.  Simply does a @code{package-provide} for the package.
+
+@item _auto-autoloads.el
+Generated.  Read when XEmacs is initialized, and provides autoloads for
+all defuns and other specially-marked forms in the sources.
+
+@item custom-loads.el
+Generated.  Read when XEmacs is initialized, and informs the Customize
+subsystem how to find the defcustom forms needed to create Customization
+forms for the usre configuration variables of the package.
+@end table
+
+
+@node Obtaining, , Control Files, The Library Maintainer's View
+@subsection Obtaining the @xpms{} and Required Utilities
+
+Currently both the infrastructure for creating XEmacs packages and the
+package sources themselves are available only by CVS.  See
+@uref{http://www.xemacs.org/Develop/cvsaccess.html} for more
+intformation.
+
+The @xpms{} currently requires GNU @file{make}, and probably XEmacs, to
+build packages.
+
+
+@node The Package Release Engineer's View, , The Library Maintainer's View, Package Overview
+@subsection The Package Release Engineer's View
+
+The XEmacs Package Release Engineer is responsible for keeping the
+system coherent.  The changes to @file{packages/package-compile.el} and
+@file{packages/xemacs-packages/Makefile} required to make the package
+available to others, and for building SUMO tarballs, @emph{etc}, are
+done by the Package Release Engineer, not individual library
+maintainers.
+
+The Package Release Engineer also maintains assorted infrastructure for
+actually making releases.  These are generally available for inspection
+in the @code{xemacs-builds} module in the CVS repository.
+
+@c #### To be completed.
+
+
+@c #### The following section is lifted verbatim from the XEmacs User's
+@c      Manual, file packages.texi.
+@node Package Terminology, Building Packages, Package Overview, Packaging
+@comment  node-name,  next,  previous,  up
+@heading Package Terminology:
+
+@subsection Libraries and Packages
+@cindex library
+@cindex package
+
+A Lisp @dfn{library} is a single loadable file containing Lisp code.  It
+may be in source or byte-compiled form.  A Lisp @dfn{package} is a set
+of one or more libraries, usually related to each other in some way,
+bundled with administrative information for convenient distribution.
+
+@subsection Package Flavors
+
+There are two main flavors of packages.
+
+@table @strong
+@item Regular Packages
+@cindex regular package
+A regular package is a set of Lisp libraries design to cooperate with
+one another.  A very complex example is Gnus.  One may not in general
+safely remove any of the component libraries.
+
+@item Single-File Packages
+@cindex single-file package
+A single-file package is an collection of thematically related but
+otherwise independent Lisp libraries.  These libraries are bundled
+together for convenience of the maintainers.  Usually individual
+libraries may be deleted at will without any loss of functionality of
+other libraries in the package.  However, we would recommend that you
+follow this rule of thumb: "When in doubt, don't delete".  If it's
+really that big a deal, request that the maintainers split the package
+into smaller aggregations.
+@end table
+
+@subsection Package Distributions
+@cindex package distributions
+@cindex binary packages
+@cindex source packages
+XEmacs Lisp packages are distributed in two ways.  @dfn{Binary packages}
+are used by system administrators and end users.  They are packaged in a
+form convenient for direct installation into an XEmacs package
+hierarchy.  @dfn{Source packages} are for developers and include all
+files necessary for rebuilding byte-compiled lisp and creating tarballs
+for distribution or installation.  This is all of the package author's
+source code plus all of the files necessary to build distribution
+tarballs (Unix Tar format files, gzipped for space savings).
+@c #### This next is an Evile Practice and should be discontinued.
+(Occasionally sources that are not relevant to XEmacs are removed.)
+
+Currently, source packages are only available via CVS.  See
+@url{http://www.xemacs.org/Develop/cvsaccess.html} for details.
+
+The package distributions are also split according to major features
+required in XEmacs to support them.  At present there are @dfn{generic}
+packages, which can be loaded by @emph{any} XEmacs, and @dfn{Mule}
+packages, which @emph{require} Mule support or they will cause errors
+when loaded.  Note that there is no guarantee that a generic package
+will have any useful functionality in a minimally configured XEmacs.  As
+long as any XEmacs can successfully load the package's libraries
+(perhaps given other required Lisp libraries), it will be classified as
+generic.  At the present time only Mule packages need be treated
+specially, and even those only if they contain multibyte characters.
+
+
+@c #### The following section is lifted verbatim from the XEmacs User's
+@c      Manual, file packages.texi.
+@node Building Packages, Local.rules File, Package Terminology, Packaging
+@comment  node-name,  next,  previous,  up
+@cindex building packages
+@cindex package building
+@heading Building Packages:
+Currently, source packages are only available via anonymous CVS.  See
+@url{http://www.xemacs.org/Develop/cvsaccess.html} for details of
+checking out the @file{packages} module.
+
+@subsection Prerequisites for Building Source Packages
+
+@table @code
+@item GNU cp
+@item GNU install 
+(or a BSD compatible install program).
+@item GNU make 
+(3.75 or later preferred).
+@item makeinfo 
+(1.68 from texinfo-3.11 or later required, 1.69 from Texinfo 4 preferred).
+@item GNU tar
+(or equivalent).
+@item GNU gzip
+(or equivalent).
+@item A properly configured @file{Local.rules} file.
+@ref{Local.rules File}.
+@end table
+
+And of course, XEmacs, 21.0 or higher.
+
+@subsection What You Can Do With Source Packages
+
+The packages CVS sources are most useful for creating XEmacs package
+tarballs for installation into your own XEmacs installations or for
+distributing to others.
+
+The supported @file{make} targets are:
+
+@table @code
+@item all
+Bytecompile all files, build and bytecompile byproduct files like
+@file{auto-autoloads.el} and @file{custom-load.el}.  Create info version
+of TeXinfo documentation if present.
+
+@c #### Why do we need this _and_ the binkit target?
+@item bindist
+Does a @code{make all} as well as create a binary package tarball in the
+staging directory.
+
+@item install
+Bytecompile all files, build and bytecompile byproduct files like
+@file{auto-autoloads.el} and @file{custom-load.el}.  Create info version
+of TeXinfo documentation if present.  And install everything into the
+staging directory.
+
+@item srckit
+Usually simply depends on @code{srckit-std}, with no actions.  This does
+a @code{make distclean} and creates a package source tarball in the
+staging directory.  This is generally only of use for package
+maintainers.
+
+@item binkit
+May depend on @code{binkit-sourceonly}, @code{binkit-sourceinfo},
+@code{binkit-sourcedata}, or @code{binkit-sourcedatainfo}, with no
+actions. @code{sourceonly} indicates there is nothing to install in a
+data directory or info directory.  @code{sourceinfo} indicates that
+source and info files are to be installed.  @code{sourcedata} indicates
+that source and etc (data) files are to be installed.
+@code{sourcedatainfo} indicates source, etc (data), and info files are
+to be installed.  A few packages have needs beyond the basic templates
+so this is not yet complete.
+
+@item dist
+Runs the rules @code{srckit} followed by @code{binkit}.  This is
+primarily of use by XEmacs maintainers producing files for distribution.
+
+@item clean
+Remove all built files except @file{auto-autoloads.el} and
+@file{custom-load.el}.
+
+@item distclean
+Remove all created files.
+@end table
+
+@c #### The following section is lifted verbatim from the XEmacs User's
+@c      Manual, file packages.texi.
+@node Local.rules File, Creating Packages, Building Packages, Packaging
+@comment  node-name,  next,  previous,  up
+@cindex local.rules
+@heading The Local.rules File:
+This file in @file{packages} provides the @xpms{} with information about
+the local configuration and environment.  To create @file{Local.rules},
+simply copy @file{Local.rules.template} from that directory to
+@file{Local.rules} and edit it to suit your needs.
+
+These are the variables in @file{Local.rules} that you will need to
+provide values for.  The following variables control which packages will
+be built:
+
+@table @var
+@item XEMACS_PACKAGES
+The default is @samp{xemacs-packages}, which results in the set in
+the @file{xemacs-packages/Makefile} @code{PACKAGES} variable.
+
+Otherwise, it should be a list of package source directories prefixed by
+@samp{xemacs-packages}:
+
+@example
+XEMACS_PACKAGES = xemacs-packages/xemacs-base xemacs-packages/bbdb
+@end example
+
+@item BUILD_WITHOUT_MULE
+The default is the empty value.
+
+Building from CVS defaults to building the Mule
+packages.  Set this to 't' if you don't want/have Mule.
+