X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=lisp%2Fdgnushack.el;h=1a90445ed83e039b1b018c688dc4585bb8aa1c2e;hb=7be3d2f29cf04a714797434aa3f4beaea9761800;hp=54debf16fa30292ab95f2e8cf5b46b0da74621dd;hpb=23b3fb4943dce1becea6efd75f9f988e50bbed52;p=elisp%2Fgnus.git- diff --git a/lisp/dgnushack.el b/lisp/dgnushack.el index 54debf1..1a90445 100644 --- a/lisp/dgnushack.el +++ b/lisp/dgnushack.el @@ -1,5 +1,6 @@ ;;; dgnushack.el --- a hack to set the load path for byte-compiling -;; Copyright (C) 1994,95,96,97,98,99 Free Software Foundation, Inc. +;; Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000 +;; Free Software Foundation, Inc. ;; Author: Lars Magne Ingebrigtsen ;; Katsumi Yamaoka @@ -27,12 +28,152 @@ ;;; Code: +;; Set coding priority of Shift-JIS to the bottom. +(defvar *predefined-category*) +(defvar coding-category-list) +(if (featurep 'xemacs) + (fset 'set-coding-priority 'ignore) + (fset 'coding-priority-list 'ignore) + (fset 'set-coding-priority-list 'ignore)) +(cond ((and (featurep 'xemacs) (featurep 'mule)) + (if (memq 'shift-jis (coding-priority-list)) + (set-coding-priority-list + (nconc (delq 'shift-jis (coding-priority-list)) '(shift-jis))))) + ((boundp 'MULE) + (put '*coding-category-sjis* 'priority (length *predefined-category*))) + ((featurep 'mule) + (if (memq 'coding-category-sjis coding-category-list) + (set-coding-priority + (nconc (delq 'coding-category-sjis coding-category-list) + '(coding-category-sjis)))))) + (fset 'facep 'ignore) (require 'cl) + +(defvar srcdir (or (getenv "srcdir") ".")) + +(push (or (getenv "W3DIR") (expand-file-name "../../w3/lisp/" srcdir)) + load-path) +(load (expand-file-name "dgnuspath.el" srcdir) nil nil t) + +;; If we are building w3 in a different directory than the source +;; directory, we must read *.el from source directory and write *.elc +;; into the building directory. For that, we define this function +;; before loading bytecomp. Bytecomp doesn't overwrite this function. +(defun byte-compile-dest-file (filename) + "Convert an Emacs Lisp source file name to a compiled file name. + In addition, remove directory name part from FILENAME." + (setq filename (byte-compiler-base-file-name filename)) + (setq filename (file-name-sans-versions filename)) + (setq filename (file-name-nondirectory filename)) + (if (memq system-type '(win32 w32 mswindows windows-nt)) + (setq filename (downcase filename))) + (cond ((eq system-type 'vax-vms) + (concat (substring filename 0 (string-match ";" filename)) "c")) + ((string-match emacs-lisp-file-regexp filename) + (concat (substring filename 0 (match-beginning 0)) ".elc")) + (t (concat filename ".elc")))) + (require 'bytecomp) -(push "." load-path) -(load "./lpath.el" nil t) + +(unless (fboundp 'si:byte-optimize-form-code-walker) + (byte-optimize-form nil);; Load `byte-opt' or `byte-optimize'. + (setq max-specpdl-size 3000) + (fset 'si:byte-optimize-form-code-walker + (symbol-function 'byte-optimize-form-code-walker)) + (defun byte-optimize-form-code-walker (form for-effect) + (if (and for-effect (memq (car-safe form) '(and or))) + ;; Fix bug in and/or forms. + (let ((fn (car form)) + (backwards (reverse (cdr form)))) + (while (and backwards + (null (setcar backwards + (byte-optimize-form (car backwards) t)))) + (setq backwards (cdr backwards))) + (if (and (cdr form) (null backwards)) + (byte-compile-log + " all subforms of %s called for effect; deleted" form)) + (if backwards + (let ((head backwards)) + (while (setq backwards (cdr backwards)) + (setcar backwards (byte-optimize-form (car backwards) + nil))) + (cons fn (nreverse head))))) + (si:byte-optimize-form-code-walker form for-effect))) + (byte-compile 'byte-optimize-form-code-walker)) + +(load (expand-file-name "gnus-clfns.el" srcdir) nil t t) + +(condition-case err + (load "~/.lpath.el" t nil t) + (error (message "Error in \"~/.lpath.el\" file: %s" err))) + +(condition-case nil + (char-after) + (wrong-number-of-arguments + ;; Optimize byte code for `char-after'. + (put 'char-after 'byte-optimizer 'byte-optimize-char-after) + (defun byte-optimize-char-after (form) + (if (null (cdr form)) + '(char-after (point)) + form)) + )) + +(condition-case nil + (char-before) + (wrong-number-of-arguments + ;; Optimize byte code for `char-before'. + (put 'char-before 'byte-optimizer 'byte-optimize-char-before) + (defun byte-optimize-char-before (form) + (if (null (cdr form)) + '(char-before (point)) + form)) + )) + +;; `char-after' and `char-before' must be well-behaved before lpath.el +;; is loaded. Because it requires `poe' via `path-util'. +(load (expand-file-name "lpath.el" srcdir) nil t t) + +(unless (fboundp 'byte-compile-file-form-custom-declare-variable) + ;; Bind defcustom'ed variables. + (put 'custom-declare-variable 'byte-hunk-handler + 'byte-compile-file-form-custom-declare-variable) + (defun byte-compile-file-form-custom-declare-variable (form) + (if (memq 'free-vars byte-compile-warnings) + (setq byte-compile-bound-variables + (cons (nth 1 (nth 1 form)) byte-compile-bound-variables))) + form)) + +;; Bind functions defined by `defun-maybe'. +(put 'defun-maybe 'byte-hunk-handler 'byte-compile-file-form-defun-maybe) +(defun byte-compile-file-form-defun-maybe (form) + (if (and (not (fboundp (nth 1 form))) + (memq 'unresolved byte-compile-warnings)) + (setq byte-compile-function-environment + (cons (cons (nth 1 form) + (cons 'lambda (cdr (cdr form)))) + byte-compile-function-environment))) + form) + +(condition-case nil + :symbol-for-testing-whether-colon-keyword-is-available-or-not + (void-variable + ;; Bind keywords. + (mapcar (lambda (keyword) (set keyword keyword)) + '(:button-keymap :data :file :mime-handle)))) + +;; Unknown variables and functions. +(unless (boundp 'buffer-file-coding-system) + (defvar buffer-file-coding-system (symbol-value 'file-coding-system))) +(unless (featurep 'xemacs) + (defalias 'Custom-make-dependencies 'ignore) + (defalias 'update-autoloads-from-directory 'ignore)) +(autoload 'texinfo-parse-line-arg "texinfmt") + +(unless (fboundp 'with-temp-buffer) + ;; Pickup some macros. + (require 'emu)) (defalias 'device-sound-enabled-p 'ignore) (defalias 'play-sound-file 'ignore) @@ -41,12 +182,10 @@ (defalias 'ange-ftp-re-read-dir 'ignore) (defalias 'define-mail-user-agent 'ignore) -(eval-and-compile - (unless (string-match "XEmacs" emacs-version) - (fset 'get-popup-menu-response 'ignore) - (fset 'event-object 'ignore) - (fset 'x-defined-colors 'ignore) - (fset 'read-color 'ignore))) +(defconst dgnushack-tool-files + '("dgnushack.el" "dgnuspath.el" "ptexinfmt.el")) +(defconst dgnushack-unexported-files + '("dgnuspath.el" "ptexinfmt.el")) (defun dgnushack-compile (&optional warn) ;;(setq byte-compile-dynamic t) @@ -61,27 +200,31 @@ You also then need to add the following to the lisp/dgnushack.el file: (push \"~/lisp/custom\" load-path) Modify to suit your needs.")) - (let ((files (directory-files "." nil "^[^=].*\\.el$")) - (xemacs (string-match "XEmacs" emacs-version)) + (let ((files (directory-files srcdir nil "^[^=].*\\.el$")) ;;(byte-compile-generate-call-tree t) file elc) - (condition-case () - (require 'w3-forms) - (error (setq files (delete "nnweb.el" (delete "nnlistserv.el" files))))) - (condition-case () - (require 'bbdb) - (error (setq files (delete "gnus-bbdb.el" files)))) + (mapcar + (lambda (el) (setq files (delete el files))) + (nconc + dgnushack-tool-files + (condition-case nil + (progn (require 'w3-forms) nil) + (error '("nnweb.el" "nnlistserv.el" "nnultimate.el" + "nnslashdot.el" "nnwarchive.el" "webmail.el"))) + (condition-case nil + (progn (require 'bbdb) nil) + (error '("gnus-bbdb.el"))) + (unless (featurep 'xemacs) + '("gnus-xmas.el" "gnus-picon.el" "messagexmas.el" + "nnheaderxm.el" "smiley.el")) + (when (and (fboundp 'md5) (subrp (symbol-function 'md5))) + '("md5.el")))) (while (setq file (pop files)) - (when (or (and (not xemacs) - (not (member file '("gnus-xmas.el" "gnus-picon.el" - "messagexmas.el" "nnheaderxm.el" - "smiley.el" "x-overlay.el")))) - (and xemacs - (not (member file '("md5.el"))))) - (when (or (not (file-exists-p (setq elc (concat file "c")))) - (file-newer-than-file-p file elc)) - (ignore-errors - (byte-compile-file file))))))) + (setq file (expand-file-name file srcdir)) + (when (or (not (file-exists-p (setq elc (concat file "c")))) + (file-newer-than-file-p file elc)) + (ignore-errors + (byte-compile-file file)))))) (defun dgnushack-recompile () (require 'gnus) @@ -90,7 +233,12 @@ Modify to suit your needs.")) ;; Avoid byte-compile warnings. (defvar gnus-product-name) -(defvar configure-package-path) +(defvar early-package-load-path) +(defvar early-packages) +(defvar last-package-load-path) +(defvar last-packages) +(defvar late-package-load-path) +(defvar late-packages) (defconst dgnushack-info-file-regexp (concat "^\\(gnus\\|message\\|emacs-mime\\|gnus-ja\\|message-ja\\)" @@ -107,52 +255,65 @@ Modify to suit your needs.")) (message "Updating autoloads for directory %s..." default-directory) (let ((generated-autoload-file "auto-autoloads.el") - noninteractive) - (update-autoloads-from-directory default-directory)) + noninteractive + (omsg (symbol-function 'message))) + (defun message (fmt &rest args) + (cond ((and (string-equal "Generating autoloads for %s..." fmt) + (file-exists-p (file-name-nondirectory (car args)))) + (funcall omsg fmt (file-name-nondirectory (car args)))) + ((string-equal "No autoloads found in %s" fmt)) + ((string-equal "Generating autoloads for %s...done" fmt)) + (t (apply omsg fmt args)))) + (unwind-protect + (update-autoloads-from-directory default-directory) + (fset 'message omsg))) (byte-compile-file "auto-autoloads.el") (with-temp-buffer (let ((standard-output (current-buffer))) (Custom-make-dependencies ".")) - (message (buffer-string))) + (message "%s" (buffer-string))) (require 'cus-load) (byte-compile-file "custom-load.el") (message "Generating MANIFEST.%s for the package..." product-name) (with-temp-buffer - (insert "pkginfo/MANIFEST." product-name "\n" - lisp-dir - (mapconcat - 'identity - (sort (directory-files "." nil "\\.elc?$") - 'string-lessp) - (concat "\n" lisp-dir)) - "\ninfo/" - (mapconcat - 'identity - (sort (directory-files "../texi/" - nil dgnushack-info-file-regexp) - 'string-lessp) - "\ninfo/") - "\n") + (insert "pkginfo/MANIFEST." product-name "\n") + (mapcar + (lambda (file) + (unless (member file dgnushack-unexported-files) + (insert lisp-dir file "\n"))) + (sort (directory-files "." nil "\\.elc?$") 'string-lessp)) + (mapcar + (lambda (file) (insert "info/" file "\n")) + (sort (directory-files "../texi/" nil dgnushack-info-file-regexp) + 'string-lessp)) (write-file (concat "../MANIFEST." product-name))))) (defun dgnushack-install-package () - (let* ((package-dir - (file-name-as-directory - (or (car command-line-args-left) - (car configure-package-path) - (error "%s" " + (let ((package-dir (car command-line-args-left)) + dirs info-dir pkginfo-dir product-name lisp-dir manifest files) + (unless package-dir + (when (boundp 'early-packages) + (setq dirs (delq nil (append (when early-package-load-path + early-packages) + (when late-package-load-path + late-packages) + (when last-package-load-path + last-packages)))) + (while (and dirs (not package-dir)) + (when (file-exists-p (car dirs)) + (setq package-dir (car dirs) + dirs (cdr dirs)))))) + (unless package-dir + (error "%s" " You must specify the name of the package path as follows: % make install-package PACKAGEDIR=/usr/local/lib/xemacs/xemacs-packages - - - GAME OVER - " - )))) - (info-dir (expand-file-name "info/" package-dir)) - (pkginfo-dir (expand-file-name "pkginfo/" package-dir)) - product-name lisp-dir manifest files) + )) + (setq info-dir (expand-file-name "info/" package-dir) + pkginfo-dir (expand-file-name "pkginfo/" package-dir)) (require 'gnus) (setq product-name (downcase gnus-product-name) lisp-dir (expand-file-name (concat "lisp/" product-name "/") @@ -167,9 +328,12 @@ You must specify the name of the package path as follows: (make-directory pkginfo-dir)) (setq files (sort (directory-files "." nil "\\.elc?$") 'string-lessp)) + (mapcar (lambda (el) (setq files (delete el files))) + dgnushack-unexported-files) (mapcar (lambda (file) - (unless (member file files) + (unless (or (member file files) + (not (string-match "\\.elc?$" file))) (setq file (expand-file-name file lisp-dir)) (message "Removing %s..." file) (condition-case nil @@ -197,21 +361,105 @@ You must specify the name of the package path as follows: (message "Done"))) -(defun dgnushack-add-info-suffix-maybe () - ;; This function must be invoked from lisp directory. - (setq default-directory "../texi/") - (let ((coding-system-for-read 'raw-text) - (coding-system-for-write 'raw-text) - (files (directory-files "." nil dgnushack-texi-file-regexp)) - file make-backup-files) - (while (setq file (pop files)) - (find-file file) - (when (and (re-search-forward - "^@setfilename[\t ]+\\([^\t\n ]+\\)" nil t) - (not (string-match "\\.info$" (match-string 1)))) - (copy-file file (concat file "_") nil t) - (insert ".info") - (save-buffer)) - (kill-buffer (current-buffer))))) +(defun dgnushack-texi-add-suffix-and-format () + (dgnushack-texi-format t)) + +(defun dgnushack-texi-format (&optional addsuffix) + (if (not noninteractive) + (error "batch-texinfo-format may only be used -batch.")) + (require 'ptexinfmt) + (let ((auto-save-default nil) + (find-file-run-dired nil) + coding-system-for-write + output-coding-system) + (let ((error 0) + file + (files ())) + (while command-line-args-left + (setq file (expand-file-name (car command-line-args-left))) + (cond ((not (file-exists-p file)) + (message ">> %s does not exist!" file) + (setq error 1 + command-line-args-left (cdr command-line-args-left))) + ((file-directory-p file) + (setq command-line-args-left + (nconc (directory-files file) + (cdr command-line-args-left)))) + (t + (setq files (cons file files) + command-line-args-left (cdr command-line-args-left))))) + (while files + (setq file (car files) + files (cdr files)) + (condition-case err + (progn + (if buffer-file-name (kill-buffer (current-buffer))) + (find-file file) + (if (boundp 'MULE) + (setq output-coding-system (symbol-value + 'file-coding-system)) + (setq coding-system-for-write buffer-file-coding-system)) + (when (and addsuffix + (re-search-forward + "^@setfilename[\t ]+\\([^\t\n ]+\\)" nil t) + (not (string-match "\\.info$" (match-string 1)))) + (insert ".info")) + (buffer-disable-undo (current-buffer)) + ;; process @include before updating node + ;; This might produce some problem if we use @lowersection or + ;; such. + (let ((input-directory default-directory) + (texinfo-command-end)) + (while (re-search-forward "^@include" nil t) + (setq texinfo-command-end (point)) + (let ((filename (concat input-directory + (texinfo-parse-line-arg)))) + (re-search-backward "^@include") + (delete-region (point) (save-excursion + (forward-line 1) + (point))) + (message "Reading included file: %s" filename) + (save-excursion + (save-restriction + (narrow-to-region + (point) + (+ (point) + (car (cdr (insert-file-contents filename))))) + (goto-char (point-min)) + ;; Remove `@setfilename' line from included file, + ;; if any, so @setfilename command not duplicated. + (if (re-search-forward "^@setfilename" + (save-excursion + (forward-line 100) + (point)) + t) + (progn + (beginning-of-line) + (delete-region (point) (save-excursion + (forward-line 1) + (point)))))))))) + (texinfo-mode) + (texinfo-every-node-update) + (set-buffer-modified-p nil) + (message "texinfo formatting %s..." file) + (texinfo-format-buffer nil) + (if (buffer-modified-p) + (progn (message "Saving modified %s" (buffer-file-name)) + (save-buffer)))) + (error + (message ">> Error: %s" (prin1-to-string err)) + (message ">> point at") + (let ((s (buffer-substring (point) + (min (+ (point) 100) + (point-max)))) + (tem 0)) + (while (setq tem (string-match "\n+" s tem)) + (setq s (concat (substring s 0 (match-beginning 0)) + "\n>> " + (substring s (match-end 0))) + tem (1+ tem))) + (message ">> %s" s)) + (setq error 1)))) + (kill-emacs error)))) ;;; dgnushack.el ends here