1 ;;; install.el --- Emacs Lisp package install utility
3 ;; Copyright (C) 1996,97,98,99,2001 Free Software Foundation, Inc.
5 ;; Author: MORIOKA Tomohiko <morioka@jaist.ac.jp>
6 ;; Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
8 ;; Keywords: install, byte-compile, directory detection
10 ;; This file is part of APEL (A Portable Emacs Library).
12 ;; This program is free software; you can redistribute it and/or
13 ;; modify it under the terms of the GNU General Public License as
14 ;; published by the Free Software Foundation; either version 2, or (at
15 ;; your option) any later version.
17 ;; This program is distributed in the hope that it will be useful, but
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 ;; General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with GNU Emacs; see the file COPYING. If not, write to
24 ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25 ;; Boston, MA 02111-1307, USA.
29 (require 'poe) ; make-directory for v18
30 (require 'path-util) ; default-load-path
33 ;;; @ compile Emacs Lisp files
36 (defun compile-elisp-module (module &optional dir force)
38 MODULE is a symbol of emacs-lisp source file name without suffix.
39 Optional 2nd argument DIR is a directory where MODULE resides in.
40 Unless optional 3rd argument FORCE is non-nil, MODULE is byte-compiled
41 only when MODULE is newer than compiled file."
42 (setq module (expand-file-name (symbol-name module) dir))
43 (let ((el-file (concat module ".el"))
44 (elc-file (concat module ".elc")))
45 (if (or force (file-newer-than-file-p el-file elc-file))
46 (byte-compile-file el-file))))
48 (defun compile-elisp-modules (modules &optional dir force)
49 "Byte-compile MODULES.
50 See `compile-elisp-module' for more information."
52 (compile-elisp-module (car modules) dir force)
53 (setq modules (cdr modules))))
59 (defvar install-overwritten-file-modes (+ (* 64 6)(* 8 4) 4) ; 0644
60 "Default file modes for files installed by `install-file'.")
62 (defun install-file (file src dst &optional move overwrite dry-run)
63 "Install FILE in SRC directory to DST directory.
64 If optional 4th argument MOVE is non-nil, remove SRC/FILE.
65 If optional 5th argument OVERWRITE is non-nil, remove DST/FILE first.
66 If optional 6th argument DRY-RUN is non-nil, just show what would have
69 (princ (format "%s -> %s\n" file dst))
70 (let ((src-file (expand-file-name file src))
71 (dst-file (expand-file-name file dst)))
72 (if (file-exists-p src-file)
73 (let ((current-file-modes (default-file-modes)))
77 (set-default-file-modes install-overwritten-file-modes)
80 (rename-file src-file dst-file overwrite)
81 (set-file-modes dst-file
82 install-overwritten-file-modes))
83 (copy-file src-file dst-file overwrite t))
84 (princ (format "%s -> %s\n" file dst)))
86 (princ (format "%s: %s\n" file (nth 1 err)))))
87 (set-default-file-modes current-file-modes)))
88 (princ (format "%s: No such file or directory\n" src-file))))))
90 (defun install-files (files src dst &optional move overwrite dry-run)
92 See `install-file' for more information."
95 (make-directory dst t))
97 (install-file (car files) src dst move overwrite dry-run)
98 (setq files (cdr files))))
101 ;;; @@ install Emacs Lisp files
104 (defun install-elisp-module (module src dst &optional dry-run)
106 MODULE is a symbol of emacs-lisp source file name without suffix.
107 See `install-file' for information of the rest of arguments."
108 (let* ((name (symbol-name module))
109 (el-file (concat name ".el"))
110 (elc-file (concat name ".elc")))
111 (install-file el-file src dst nil 'overwrite dry-run)
112 (install-file elc-file src dst 'move 'overwrite dry-run)))
114 (defun install-elisp-modules (modules src dst &optional dry-run)
116 See `install-elisp-modules' for more information."
119 (make-directory dst t))
121 (install-elisp-module (car modules) src dst dry-run)
122 (setq modules (cdr modules))))
125 ;;; @ detect install path
128 ;; install to shared directory (maybe "/usr/local")
129 (defvar install-prefix
130 (if (or (<= emacs-major-version 18)
132 (and (boundp 'system-configuration-options) ; 19.29 or later
133 (string= system-configuration-options "NT"))) ; for Meadow
134 (expand-file-name "../../.." exec-directory)
135 (expand-file-name "../../../.." data-directory)))
137 (defvar install-elisp-prefix
138 (if (>= emacs-major-version 19)
140 ;; v18 does not have standard site directory.
143 (defun install-detect-elisp-directory (&optional prefix elisp-prefix
144 allow-version-specific)
146 (setq prefix install-prefix))
148 (setq elisp-prefix install-elisp-prefix))
150 (let ((rest default-load-path)
152 (expand-file-name (concat ".*/" elisp-prefix)
156 (if (string-match regexp (car rest))
157 (if (or allow-version-specific
158 (not (string-match (format "/%d\\.%d"
162 (throw 'tag (car rest))))
163 (setq rest (cdr rest)))))
164 (expand-file-name (concat (if (and (not (featurep 'xemacs))
165 (or (>= emacs-major-version 20)
166 (and (= emacs-major-version 19)
167 (> emacs-minor-version 28))))
175 ;; unfortunately, unofficial mule based on
176 ;; 19.29 and later use "emacs/" by default.
177 ((boundp 'MULE) "mule/")
178 ((boundp 'NEMACS) "nemacs/")
183 (defvar install-default-elisp-directory
184 (install-detect-elisp-directory))
187 ;;; @ for XEmacs package system
190 (defun install-update-package-files (package dir &optional dry-run)
193 (princ (format "Updating autoloads in directory %s..\n\n" dir))
195 (princ (format "Processing %s\n" dir))
196 (princ "Generating custom-load.el...\n\n")
198 (princ (format "Compiling %s...\n"
199 (expand-file-name "auto-autoloads.el" dir)))
200 (princ (format "Wrote %s\n"
201 (expand-file-name "auto-autoloads.elc" dir)))
203 (princ (format "Compiling %s...\n"
204 (expand-file-name "custom-load.el" dir)))
205 (princ (format "Wrote %s\n"
206 (expand-file-name "custom-load.elc" dir))))
208 (setq autoload-package-name package)
210 (let ((command-line-args-left (list dir)))
211 (batch-update-directory))
213 (let ((command-line-args-left (list dir)))
214 (Custom-make-dependencies))
216 (byte-compile-file (expand-file-name "auto-autoloads.el" dir))
217 (byte-compile-file (expand-file-name "custom-load.el" dir)))))
220 ;;; @ Other Utilities
223 (defun install-just-print-p ()
224 (let ((flag (getenv "MAKEFLAGS"))
225 (case-fold-search nil))
226 (princ (format "MAKEFLAGS=%s\n" (or flag "")))
228 ;; Check whether MAKEFLAGS contain "n" option or not.
229 (string-match "^\\(\\(--[^ ]+ \\)+-\\|[^ =-]\\)*n" flag))))
236 (product-provide (provide 'install) (require 'apel-ver))
238 ;;; install.el ends here