update.
[elisp/apel.git] / EMU-ELS
diff --git a/EMU-ELS b/EMU-ELS
index 4a170cf..f0b14aa 100644 (file)
--- a/EMU-ELS
+++ b/EMU-ELS
-;;; -*-Emacs-Lisp-*-
+;;; EMU-ELS --- list of EMU modules to install. -*-Emacs-Lisp-*-
 
-;; EMU-ELS: list of EMU modules to install
+;;; Commentary:
+
+;; APEL-MK imports `emu-modules' and `emu-modules-to-compile' from here.
 
 ;;; Code:
 
-(setq emu-modules (cons 'emu
-                       (if (or running-emacs-19_29-or-later
-                               running-xemacs-19_14-or-later)
-                           '(richtext)
-                         '(tinyrich)
-                         )))
-
-(let ((poe-modules '(poe))
-      (poem-modules '(poem))
-      (mcs-modules '(mcharset))
-      (invisible-modules '(invisible))
-      pccl-modules)
-  (cond ((featurep 'xemacs)
-        (setq poe-modules (cons 'poe-xemacs poe-modules)
-              invisible-modules (cons 'inv-xemacs invisible-modules))
-        )
-       ((>= emacs-major-version 19)
-        (setq invisible-modules (cons 'inv-19 invisible-modules))
-        )
-       (t
-        (setq poe-modules (cons 'poe-18 poe-modules)
-              invisible-modules (cons 'inv-18 invisible-modules))
-        ))
-  (cond ((featurep 'mule)
-        (cond ((featurep 'xemacs)
-               (setq poem-modules (cons 'poem-xm (cons 'poem-20
-                                                       poem-modules))
-                     mcs-modules (cons 'mcs-xm (cons 'mcs-20 mcs-modules)))
-               (if (>= emacs-major-version 21)
-                   (setq pccl-modules '(pccl-20 pccl))
-                 )
-               )
-              ((>= emacs-major-version 20)
-               (setq poem-modules (cons 'poem-e20 (cons 'poem-20
-                                                        poem-modules))
-                     mcs-modules (cons 'mcs-e20 (cons 'mcs-20
-                                                      mcs-modules))
-                     pccl-modules '(pccl-20 pccl))
-               (setq poem-modules
-                     (cons
-                      (if (and
-                           (fboundp 'set-buffer-multibyte)
-                           (subrp (symbol-function 'set-buffer-multibyte)))
-                          'poem-e20_3
-                        'poem-e20_2)
-                      poem-modules))
-               )
-              (t
-               (setq poem-modules (cons 'poem-om poem-modules)
-                     mcs-modules (cons 'mcs-om mcs-modules)
-                     pccl-modules '(pccl-om pccl)
-                     emu-modules (cons 'emu-mule emu-modules))
-               ))
-        )
-       ((boundp 'NEMACS)
-        (setq poem-modules (cons 'poem-nemacs poem-modules)
-              mcs-modules (cons 'mcs-nemacs mcs-modules))
-        )
-       (t
-        (setq poem-modules (cons 'poem-ltn1 poem-modules)
-              mcs-modules (cons 'mcs-ltn1 mcs-modules))
-        ))
-  
-  (setq emu-modules (append poe-modules poem-modules
-                           mcs-modules invisible-modules
-                           pccl-modules
-                           emu-modules))
-  (setq emu-modules (cons 'broken emu-modules))
-  )
+(defvar emu-modules-not-to-compile nil)
+(defvar emu-modules-to-compile nil)
+
+;; We use compile-time evaluation heavily.  So, order of compilation is
+;; very significant.  For example, loading some module before compiling
+;; it will cause "compile-time" evaluation many times.
+(defvar emu-modules
+  (nconc
+   ;; modules are sorted by compilation order.
+   '(static broken)
+
+   ;; product information.
+   '(product apel-ver)
+
+   ;; poe modules; poe modules depend on static.
+   '(pym)
+   (cond
+    ;; XEmacs.
+    ((featurep 'xemacs)
+     '(poe-xemacs poe))
+    ;; Emacs 19.29 and earlier. (yes, includes Emacs 19.29.)
+    ((and (= emacs-major-version 19)
+         (<= emacs-minor-version 29))
+     '(localhook poe))
+    ;; Emacs 19.30 and later.
+    ((>= emacs-major-version 19)
+     '(poe))
+    (t
+     ;; v18.
+     '(localhook env poe-18 poe)))
+
+   ;; pcustom modules; pcustom modules depend on poe.
+   (if (and (module-installed-p 'custom)
+           ;; new custom requires widget.
+           (module-installed-p 'widget))
+       ;; if both 'custom and 'widget are found, we have new custom.
+       '(pcustom)
+     ;; pcustom does (require 'custom) at compile-time, and tinycustom
+     ;; need to test existence of some custom macros at compile-time!
+     ;; so, we must compile tinycustom first.
+     '(tinycustom pcustom))
+
+   ;; pccl modules; pccl modules depend on broken.
+   (cond
+    ((featurep 'xemacs)
+     (cond
+      ;; XEmacs 21 w/ mule.
+      ((and (featurep 'mule)
+           (>= emacs-major-version 21))
+       '(pccl-20 pccl))
+      (t
+       '(pccl))))
+    ((featurep 'mule)
+     (cond
+      ;; Emacs 20.
+      ((>= emacs-major-version 20)
+       '(pccl-20 pccl))
+      ;; Mule 1.* and 2.*.
+      (t
+       '(pccl-om pccl))))
+    (t
+     '(pccl)))
+
+   ;; pces modules; pces modules depend on poe.
+   (cond
+    ((featurep 'xemacs)
+     (cond
+      ((featurep 'mule)
+       ;; XEmacs w/ mule.
+       ;; pces-xfc depends pces-20, so we compile pces-20 first.
+       '(pces-20 pces-xm pces-xfc pces))
+      ((featurep 'file-coding)
+       ;; XEmacs w/ file-coding.
+       ;; pces-xfc depends pces-20, so we compile pces-20 first.
+       '(pces-20 pces-xfc pces))
+      (t
+       '(pces-raw pces))))
+    ((featurep 'mule)
+     (cond
+      ;; Emacs 20.3 and later.
+      ((and (fboundp 'set-buffer-multibyte)
+           (subrp (symbol-function 'set-buffer-multibyte)))
+       ;; pces-e20 depends pces-20, so we compile pces-20 first.
+       '(pces-20 pces-e20 pces))
+      ;; Emacs 20.1 and 20.2.
+      ((= emacs-major-version 20)
+       ;; pces-e20 depends pces-20, so we compile pces-20 first.
+       '(pces-20 pces-e20_2 pces-e20 pces))
+      (t
+       ;; Mule 1.* and 2.*.
+       '(pces-om pces))))
+    ((boundp 'NEMACS)
+     ;; Nemacs.
+     '(pces-nemacs pces))
+    (t
+     '(pces-raw pces)))
+
+   ;; poem modules; poem modules depend on pces.
+   (cond
+    ((featurep 'mule)
+     (cond
+      ((featurep 'xemacs)
+       ;; XEmacs w/ mule.
+       '(poem-xm poem))
+      ((>= emacs-major-version 20)
+       (if (and (fboundp 'set-buffer-multibyte)
+               (subrp (symbol-function 'set-buffer-multibyte)))
+          ;; Emacs 20.3 and later.
+          '(poem-e20_3 poem-e20 poem)
+        ;; Emacs 20.1 and 20.2.
+        '(poem-e20_2 poem-e20 poem)))
+      (t
+       ;; Mule 1.* and 2.*.
+       '(poem-om poem))))
+    ((boundp 'NEMACS)
+     '(poem-nemacs poem))
+    (t
+     '(poem-ltn1 poem)))
+
+   ;; mcharset modules; mcharset modules depend on poem and pcustom.
+   (cond
+    ((featurep 'mule)
+     (cond
+      ((featurep 'xemacs)
+       ;; XEmacs w/ mule.
+       (if (featurep 'utf-2000)
+          ;; XEmacs w/ UTF-2000.
+          (setq emu-modules-not-to-compile
+                (cons 'mcs-xmu emu-modules-not-to-compile)))
+       ;; mcs-xm depends mcs-20, so we compile mcs-20 first.
+       '(mcs-20 mcs-xmu mcs-xm mcharset))
+      ((>= emacs-major-version 20)
+       ;; Emacs 20 and later.
+       ;; mcs-e20 depends mcs-20, so we compile mcs-20 first.
+       '(mcs-20 mcs-e20 mcharset))
+      (t
+       ;; Mule 1.* and 2.*.
+       '(mcs-om mcharset))))
+    ((boundp 'NEMACS)
+     ;; Nemacs.
+     '(mcs-nemacs mcharset))
+    (t
+     '(mcs-ltn1 mcharset)))
+
+   ;; timezone.el; Some versions have Y2K problem.
+   (condition-case nil
+       (let ((load-path (delete (expand-file-name ".")
+                               (copy-sequence load-path))))
+        ;; v18 does not have timezone.el.
+        (require 'timezone)
+        ;; Is timezone.el APEL version?
+        (if (product-find 'timezone)
+            (error "timezone.el is APEL version. Install newer version."))
+        ;; Y2K test.
+        (or (string= (aref (timezone-parse-date "Sat, 1 Jan 00 00:00:00 GMT")
+                           0)
+                     "2000")
+            (error "timezone.el has Y2K problem. Install fixed version."))
+        ;; Old parser test.
+        (if (string=
+             (aref (timezone-parse-date "Wednesday, 31-Jan-01 09:00:00 GMT")
+                   0)
+             "0")
+            (error "timezone.el has old date parser. Install fixed version."))
+        ;; no problem.
+        '())
+     (error
+      '(timezone)))
+
+   ;; invisible modules; provided for backward compatibility with old "tm".
+   (cond
+    ((featurep 'xemacs)
+     ;; XEmacs.
+     '(inv-xemacs invisible))
+    ((>= emacs-major-version 23)
+     ;; Emacs 23 and later
+     '(inv-23 invisible))
+    ((>= emacs-major-version 19)
+     ;; Emacs 19 and later.
+     '(inv-19 invisible))
+    (t
+     ;; v18.
+     '(inv-18 invisible)))
+
+   ;; emu modules; provided for backward compatibility with old "tm".
+   (if (and (featurep 'mule)
+           (< emacs-major-version 20))
+       ;; Mule 1.* and 2.*.
+       '(emu-mule emu)
+     '(emu))
+
+   ;; emu submodules; text/richtext and text/enriched support.
+   (if (if (featurep 'xemacs)
+          (or (>= emacs-major-version 20)
+              (and (= emacs-major-version 19)
+                   (>= emacs-minor-version 14)))
+        (or (>= emacs-major-version 20)
+            (and (= emacs-major-version 19)
+                 (>= emacs-minor-version 29))))
+       ;; XEmacs 19.14 and later, or Emacs 19.29 and later.
+       '(richtext)
+     '(tinyrich))
+
+   ;; mule-caesar.el; part of apel-modules, but it is version-dependent.
+   '(mule-caesar)))
+
+;; Generate `emu-modules-to-compile' from `emu-modules-not-to-compile'
+;; and `emu-modules'.
+(let ((modules emu-modules-not-to-compile))
+  (setq emu-modules-to-compile (copy-sequence emu-modules))
+  (while modules
+    (setq emu-modules-to-compile (delq (car modules) emu-modules-to-compile)
+         modules (cdr modules))))
 
 ;;; EMU-ELS ends here