;;; -*-Emacs-Lisp-*-

;; NICOLA-DDSKK-MK: installer for NICOLA-DDSKK.

;;; Code:

(require 'cl)
(require 'advice)

(defun config-nicola-ddskk ()
  (let (prefix lisp-dir version-specific-lisp-dir)
    (and (setq prefix (car command-line-args-left))
	 (or (string-equal "NONE" prefix)
	     (defvar PREFIX prefix)))
    (setq command-line-args-left (cdr command-line-args-left))
    (and (setq lisp-dir (car command-line-args-left))
	 (or (string-equal "NONE" lisp-dir)
	     (defvar LISPDIR lisp-dir)))
    (setq command-line-args-left (cdr command-line-args-left))
    (and (setq version-specific-lisp-dir (car command-line-args-left))
	 (or (string-equal "NONE" version-specific-lisp-dir)
	     (progn
	       (defvar VERSION_SPECIFIC_LISPDIR version-specific-lisp-dir)
	       (princ (format "VERSION_SPECIFIC_LISPDIR=%s\n"
			      VERSION_SPECIFIC_LISPDIR)))))
    (setq command-line-args-left (cdr command-line-args-left))
    (load-file "NICOLA-DDSKK-CFG")
    (load-file "NICOLA-DDSKK-ELS")
    (and (= emacs-major-version 18)
	 (require 'skk-e18))
    (autoload 'browse-url "browse-url" nil t)
    (autoload 'browse-url-netscape "browse-url" nil t)
    (autoload 'update-buffer-local-frame-params "ccc")
    (autoload 'set-buffer-local-cursor-color "ccc")
    (autoload 'skk-cursor-current-color "skk-cursor")
    (princ (format "PREFIX=%s
LISPDIR=%s\n" PREFIX LISPDIR))))

(defun compile-nicola-ddskk ()
  (condition-case nil (load "bytecomp-runtime.el") (error))
  (config-nicola-ddskk)
  (require 'pcustom)
  (unless (= emacs-major-version 18)
    (require 'skk-isearch))
  (require 'skk-macs)
  (require 'skk-autoloads)
  (require 'skk)
  (nicola-ddskk-generate-autoloads)
  (compile-elisp-modules nicola-ddskk-modules "."))

(defun install-nicola-ddskk ()
  (config-nicola-ddskk)
  (require 'pcustom)
  (install-elisp-modules nicola-ddskk-modules "./" NICOLA-DDSKK_DIR)
  (delete-file "./nicola-ddskk-autoloads.el"))

(defun config-nicola-ddskk-package ()
  (require 'cus-load)
  (let (package-dir)
    (and (setq package-dir (car command-line-args-left))
	 (or (string= "NONE" package-dir)
	     (defvar PACKAGEDIR package-dir)))
    (setq command-line-args-left (cdr command-line-args-left))
    (load-file "NICOLA-DDSKK-CFG")
    (load-file "NICOLA-DDSKK-ELS")
    (setq nicola-ddskk-modules (append nicola-ddskk-modules
			       '(auto-autoloads custom-load)))
    (princ (format "PACKAGEDIR=%s\n" PACKAGEDIR))))

(defun compile-nicola-ddskk-package ()
  (config-nicola-ddskk-package)

  (setq autoload-package-name "nicola-ddskk")
  (add-to-list 'command-line-args-left ".")
  (batch-update-directory)

  (add-to-list 'command-line-args-left ".")
  (Custom-make-dependencies)

  (require 'nicola-ddskk-autoloads "./auto-autoloads.el")
  (require 'pcustom)
  (require 'skk-isearch)
  (require 'skk-macs)
  (require 'skk-autoloads)
  (require 'skk)
  (compile-elisp-modules nicola-ddskk-modules "."))

(defun install-nicola-ddskk-package ()
  (config-nicola-ddskk-package)
  (install-elisp-modules nicola-ddskk-modules
			 "./"
			 (expand-file-name NICOLA-DDSKK_PREFIX
					   (expand-file-name "lisp"
							     PACKAGEDIR)))
  (delete-file "./auto-autoloads.el")
  (delete-file "./custom-load.el"))

(defun nicola-ddskk-generate-autoloads ()
  "Generate nicola-ddskk-autoload.el."
  (let ((buf (get-buffer-create " *nicola-ddskk-generate-autoloads*"))
        sort-min standard-output)
    (save-excursion
      (set-buffer buf)
      (erase-buffer)
      (cond
       ((and (condition-case nil
		 (and (require 'autoload)
		      (require 'poem))
	       (error))
	     (fboundp 'generate-file-autoloads))
	(dolist (module nicola-ddskk-modules)
	  (let ((file (expand-file-name (format "%s.el" module)
					default-directory)))
	    (and (file-exists-p file)
		 (generate-file-autoloads file))))
	(goto-char (point-max))
	(insert "\n(provide 'nicola-ddskk-autoloads)
")
	(write-region-as-coding-system
	 (if (boundp 'MULE) *junet*unix 'iso-2022-7bit)
	 (point-min) (point-max) "nicola-ddskk-autoloads.el" nil nil)
	(kill-buffer buf))
       (t
	(setq sort-min (point))
	(do ((modules nicola-ddskk-modules (cdr modules)))
	    ((null modules))
	  (do ((funcs (nicola-ddskk-generate-file-autoloads (car modules))
		      (cdr funcs)))
	      ((null funcs))
	    (insert "(autoload '" (caar funcs)
		    " \"" (file-name-nondirectory (symbol-name (car modules)))
		    "\" nil "
		    (symbol-name (if (cdar funcs) t))
		    " nil)\n")))
	(sort-lines nil sort-min (point-max))
	(goto-char (point-max))
	(insert "\n(provide 'nicola-ddskk-autoloads)
")
	(write-region (point-min) (point-max) "nicola-ddskk-autoloads.el"
		      nil nil)
	(kill-buffer buf))))))

(defun nicola-ddskk-generate-file-autoloads (module)
  "Return a list of autoload functions defined in MODULE."
  (let ((file (concat (symbol-name module) ".el"))
        (funcs))
    (when (file-exists-p file)
      (message "Generating autoloads for %s..." file)
      (save-excursion
	(insert-file-contents file)
	(while (re-search-forward "^;;;###autoload" nil t)
	  (beginning-of-line 2)
	  (if (looking-at "(defun[ 	]+\\([^ 	(]+\\)")
	      (setq funcs
		    (cons (cons (match-string 1)
				(save-excursion
				  (re-search-forward
				   "^[ 	]*(interactive"
				   (save-excursion
				     (re-search-forward "^(defun" nil t 2))
				   t)))
			  funcs)))))
      (delete-region (point) (point-max))
      (message "Generating autoloads for %s...done" file))
    funcs))

;;; NICOLA-DDSKK-MK ends here
