Skip to content


Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

248 lines (204 sloc) 8.07 kb
;;; install.el --- Emacs Lisp package install utility
;; Copyright (C) 1996,97,98,99,2001 Free Software Foundation, Inc.
;; Author: MORIOKA Tomohiko <>
;; Shuhei KOBAYASHI <>
;; Created: 1996/08/18
;; Keywords: install, byte-compile, directory detection
;; This file is part of APEL (A Portable Emacs Library).
;; This program is free software; you can redistribute it and/or
;; modify it under the terms of the GNU General Public License as
;; published by the Free Software Foundation; either version 2, or (at
;; your option) any later version.
;; This program is distributed in the hope that it will be useful, but
;; WITHOUT ANY WARRANTY; without even the implied warranty of
;; General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.
;;; Code:
(require 'poe) ; make-directory for v18
(require 'path-util) ; default-load-path
;;; @ compile Emacs Lisp files
(defun compile-elisp-module (module &optional dir force)
"Byte-compile MODULE.
MODULE is a symbol of emacs-lisp source file name without suffix.
Optional 2nd argument DIR is a directory where MODULE resides in.
Unless optional 3rd argument FORCE is non-nil, MODULE is byte-compiled
only when MODULE is newer than compiled file."
(setq module (expand-file-name (symbol-name module) dir))
(let ((el-file (concat module ".el"))
(elc-file (concat module ".elc")))
(if (or force (file-newer-than-file-p el-file elc-file))
(byte-compile-file el-file))))
(defun compile-elisp-modules (modules &optional dir force)
"Byte-compile MODULES.
See `compile-elisp-module' for more information."
(while modules
(compile-elisp-module (car modules) dir force)
(setq modules (cdr modules))))
;;; @ install files
(defvar install-overwritten-file-modes (+ (* 64 6)(* 8 4) 4) ; 0644
"Default file modes for files installed by `install-file'.")
(defun install-file (file src dst &optional move overwrite dry-run)
"Install FILE in SRC directory to DST directory.
If optional 4th argument MOVE is non-nil, remove SRC/FILE.
If optional 5th argument OVERWRITE is non-nil, remove DST/FILE first.
If optional 6th argument DRY-RUN is non-nil, just show what would have
been installed."
(if dry-run
(princ (format "%s -> %s\n" file dst))
(let ((src-file (expand-file-name file src))
(dst-file (expand-file-name file dst)))
(if (file-exists-p src-file)
(let ((current-file-modes (default-file-modes)))
(condition-case err
(set-default-file-modes install-overwritten-file-modes)
(if move
(rename-file src-file dst-file overwrite)
(set-file-modes dst-file
(copy-file src-file dst-file overwrite t))
(princ (format "%s -> %s\n" file dst)))
(princ (format "%s: %s\n" file (nth 1 err)))))
(set-default-file-modes current-file-modes)))
(princ (format "%s: No such file or directory\n" src-file))))))
(defun install-files (files src dst &optional move overwrite dry-run)
"Install FILES.
See `install-file' for more information."
(or dry-run
(file-exists-p dst)
(make-directory dst t))
(while files
(install-file (car files) src dst move overwrite dry-run)
(setq files (cdr files))))
;;; @@ install Emacs Lisp files
(defun install-elisp-module (module src dst &optional dry-run)
"Install MODULE.
MODULE is a symbol of emacs-lisp source file name without suffix.
See `install-file' for information of the rest of arguments."
(let* ((name (symbol-name module))
(el-file (concat name ".el"))
(elc-file (concat name ".elc")))
(install-file el-file src dst nil 'overwrite dry-run)
(install-file elc-file src dst 'move 'overwrite dry-run)))
(defun install-elisp-modules (modules src dst &optional dry-run)
"Install MODULES.
See `install-elisp-modules' for more information."
(or dry-run
(file-exists-p dst)
(make-directory dst t))
(while modules
(install-elisp-module (car modules) src dst dry-run)
(setq modules (cdr modules))))
;;; @ detect install path
(defvar install-prefix
((<= emacs-major-version 18)
;; The default of `exec-directory' is "/usr/local/emacs/etc".
;; (See src/paths.h-dist)
(expand-file-name "../.." exec-directory))
((featurep 'meadow)
;; I have no idea, sorry.
(expand-file-name "../../.." data-directory))
((featurep 'xemacs)
;; The default of 'data-directory' is
;; "/usr/local/lib/xemacs-$VERSION/etc".
(expand-file-name "../../.." data-directory))
;; The default of 'data-directory' is
;; "/usr/local/lib/emacs/$VERSION/etc" (19.28 and earlier), or
;; "/usr/local/share/emacs/$VERSION/etc" (19.29 and later).
(expand-file-name "../../../.." data-directory)))
"Install prefix, normally \"/usr/local\".")
;; v18 does not have the default, please set explicitly.
(defvar install-elisp-prefix "site-lisp"
"Prefix for local lisp directory, normally \"site-lisp\".")
(defun install-detect-elisp-directory (&optional prefix elisp-prefix
(or prefix
(setq prefix install-prefix))
(or elisp-prefix
(setq elisp-prefix install-elisp-prefix))
(or (let ((rest default-load-path)
(regexp (concat "^"
(expand-file-name (concat ".*/" elisp-prefix)
(found nil))
(while (and rest (not found))
(if (string-match regexp (car rest))
(if (or allow-version-specific
(not (string-match (format "/%d\\.%d"
(car rest))))
(setq found (car rest))))
(setq rest (cdr rest)))
;; we couldn't find appropriate directory from `load-path'.
;; use the default directory for each emacsen.
(expand-file-name (concat (if (and (not (featurep 'xemacs))
(or (>= emacs-major-version 20)
(and (= emacs-major-version 19)
(> emacs-minor-version 28))))
((featurep 'xemacs) "xemacs/")
;; unfortunately, unofficial mule based on
;; 19.29 and later use "emacs/" by default.
((boundp 'MULE) "mule/")
((boundp 'NEMACS) "nemacs/")
(t "emacs/"))
(defvar install-default-elisp-directory
;;; @ for XEmacs package system
(defun install-update-package-files (package dir &optional dry-run)
(princ (format "Updating autoloads in directory %s..\n\n" dir))
(princ (format "Processing %s\n" dir))
(princ "Generating custom-load.el...\n\n")
(princ (format "Compiling %s...\n"
(expand-file-name "auto-autoloads.el" dir)))
(princ (format "Wrote %s\n"
(expand-file-name "auto-autoloads.elc" dir)))
(princ (format "Compiling %s...\n"
(expand-file-name "custom-load.el" dir)))
(princ (format "Wrote %s\n"
(expand-file-name "custom-load.elc" dir))))
(setq autoload-package-name package)
(let ((command-line-args-left (list dir)))
(let ((command-line-args-left (list dir)))
(byte-compile-file (expand-file-name "auto-autoloads.el" dir))
(byte-compile-file (expand-file-name "custom-load.el" dir)))))
;;; @ Other Utilities
(defun install-just-print-p ()
(let ((flag (getenv "MAKEFLAGS"))
(case-fold-search nil))
(princ (format "MAKEFLAGS=%s\n" (or flag "")))
(if flag
;; Check whether MAKEFLAGS contain "n" option or not.
(string-match "^\\(\\(--[^ ]+ \\)+-\\|[^ =-]\\)*n" flag))))
;;; @ end
(require 'product)
(product-provide (provide 'install) (require 'apel-ver))
;;; install.el ends here
Jump to Line
Something went wrong with that request. Please try again.