forked from FG42/FG42
211 lines
7.1 KiB
EmacsLisp
211 lines
7.1 KiB
EmacsLisp
|
;;; silentcomp.el --- compile time setup for proper compilation
|
|||
|
|
|||
|
;; Copyright (C) 2000 - 2005 Klaus Berndl,
|
|||
|
;; Free Software Foundation, Inc.
|
|||
|
|
|||
|
;; Author: Klaus Berndl <klaus.berndl@sdm.de>
|
|||
|
;; Maintainer: Klaus Berndl <klaus.berndl@sdm.de>
|
|||
|
;; Keywords: bytecompiling
|
|||
|
;; Created: 2002
|
|||
|
|
|||
|
;; 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 MERCHANTABILITY or FITNESS
|
|||
|
;; FOR A PARTICULAR PURPOSE. See the GNU 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.
|
|||
|
|
|||
|
;; $Id$
|
|||
|
|
|||
|
;;; Location
|
|||
|
|
|||
|
;; The latest version of this package is always available at
|
|||
|
;; http://www.emacswiki.org/elisp/index.html
|
|||
|
|
|||
|
;;; Commentary:
|
|||
|
|
|||
|
;; This file provides features to defeat the compiler warnings for selected
|
|||
|
;; symbols.
|
|||
|
;;
|
|||
|
;; This functionality ought to be provided by the byte compilers or some
|
|||
|
;; accompanying library. To use it from some package "foo.el", begin by
|
|||
|
;; putting the following code at the top of the file:
|
|||
|
;;
|
|||
|
;; (eval-when-compile
|
|||
|
;; (require 'silentcomp))
|
|||
|
;;
|
|||
|
;; At the end of foo.el there should normally be a "(provide 'foo)". Replace
|
|||
|
;; it with "(silentcomp-provide 'foo)"; that is necessary to restore the
|
|||
|
;; environment after the byte compilation. If you don't have a `provide' at
|
|||
|
;; the end, you have to add the following as the very last form in the file:
|
|||
|
;;
|
|||
|
;; (eval-when-compile (silentcomp-restore-environment))
|
|||
|
;;
|
|||
|
;; Now everything is set to use the various macros in this package.
|
|||
|
;;
|
|||
|
;; To suppress byte compiler warnings, use the macros `silentcomp-defun',
|
|||
|
;; `silentcomp-defvar'
|
|||
|
;;
|
|||
|
;;
|
|||
|
;; Example:
|
|||
|
;;
|
|||
|
;; Suppose a file foo.el with the following code:
|
|||
|
;;
|
|||
|
;; (defun nolog-message (&rest args)
|
|||
|
;; "Works exactly like `message' but does not log the message"
|
|||
|
;; (let ((msg (cond ((or (null args)
|
|||
|
;; (null (car args)))
|
|||
|
;; nil)
|
|||
|
;; ((null (cdr args))
|
|||
|
;; (car args))
|
|||
|
;; (t
|
|||
|
;; (apply 'format args)))))
|
|||
|
;; ;; Now message is either nil or the formated string.
|
|||
|
;; (if running-xemacs
|
|||
|
;; ;; XEmacs way of preventing log messages.
|
|||
|
;; (if msg
|
|||
|
;; (display-message 'no-log msg)
|
|||
|
;; (clear-message 'no-log))
|
|||
|
;; ;; Emacs way of preventing log messages.
|
|||
|
;; (let ((message-log-max nil)
|
|||
|
;; (message-truncate-lines nil))
|
|||
|
;; (if msg
|
|||
|
;; (message "%s" msg)
|
|||
|
;; (message nil))))
|
|||
|
;; msg))
|
|||
|
;;
|
|||
|
;; foo.el should be work for both of Emacs and XEmacs, so we use the functions
|
|||
|
;; `display-message' and `clear-message' for the XEmacs stuff and the
|
|||
|
;; variables `message-log-max' and `message-truncate-lines' for Emacs. The
|
|||
|
;; XEmacs-symbols are unbound in Emacs and vice versa. Therefore the
|
|||
|
;; bytecompiler throws warnings about undefined symbols. These warnings can
|
|||
|
;; savely be ignored but are nevertheless annoying and ugly especially if you
|
|||
|
;; have a lot of symbols existing in only one version of (X)Emacs.
|
|||
|
;;
|
|||
|
;; With silentcomp.el you can silence the bytecompiler for foo.el:
|
|||
|
;;
|
|||
|
;; ,----
|
|||
|
;; | foo.el
|
|||
|
;; |
|
|||
|
;; | (eval-when-compile
|
|||
|
;; | (require 'silentcomp))
|
|||
|
;; |
|
|||
|
;; | ;; XEmacs
|
|||
|
;; | (silentcomp-defun display-message)
|
|||
|
;; | (silentcomp-defun clear-message)
|
|||
|
;; | ;; Emacs
|
|||
|
;; | (silentcomp-defvar message-log-max)
|
|||
|
;; | (silentcomp-defvar message-truncate-lines)
|
|||
|
;; |
|
|||
|
;; | ;; Code
|
|||
|
;; | (defun nolog-message (&rest args)
|
|||
|
;; | ...
|
|||
|
;; | )
|
|||
|
;; |
|
|||
|
;; | (silentcomp-provide 'foo)
|
|||
|
;; | ;; foo.el ends here
|
|||
|
;; `----
|
|||
|
|
|||
|
|
|||
|
;; This package is stolen from original cc-bytecomp.el from Martin Stjernholm
|
|||
|
;; who is the maintainer of cc-mode.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
;;; Code:
|
|||
|
|
|||
|
(defvar silentcomp-unbound-variables nil)
|
|||
|
(defvar silentcomp-original-functions nil)
|
|||
|
(defvar silentcomp-environment-set nil)
|
|||
|
|
|||
|
(defun silentcomp-restore-environment ()
|
|||
|
;; Eval'ed during compilation to restore variables, functions etc
|
|||
|
;; declared with `silentcomp-defvar' et al.
|
|||
|
(if (not load-in-progress)
|
|||
|
(let (p)
|
|||
|
(setq p silentcomp-unbound-variables)
|
|||
|
(while p
|
|||
|
(let ((var (car p)))
|
|||
|
(if (and (boundp var)
|
|||
|
(eq (intern (concat "silentcomp-ignore-var:"
|
|||
|
(symbol-name var)))
|
|||
|
var))
|
|||
|
(makunbound var)))
|
|||
|
(setq p (cdr p)))
|
|||
|
(setq p silentcomp-original-functions)
|
|||
|
(while p
|
|||
|
(let ((fun (car (car p)))
|
|||
|
(def (car (cdr (cdr (car p))))))
|
|||
|
(if (and (fboundp fun)
|
|||
|
(eq (intern (concat "silentcomp-ignore-fun:"
|
|||
|
(symbol-name fun)))
|
|||
|
(symbol-function fun)))
|
|||
|
(if (eq def 'unbound)
|
|||
|
(fmakunbound fun)
|
|||
|
(fset fun def))))
|
|||
|
(setq p (cdr p)))
|
|||
|
(setq silentcomp-environment-set nil))))
|
|||
|
|
|||
|
(defun silentcomp-is-compiling ()
|
|||
|
"Return non-nil if eval'ed during compilation. Don't use outside
|
|||
|
`eval-when-compile'."
|
|||
|
(and (boundp 'byte-compile-dest-file)
|
|||
|
(stringp byte-compile-dest-file)))
|
|||
|
|
|||
|
(defmacro silentcomp-defvar (var)
|
|||
|
"Binds the symbol as a variable during compilation of the file,
|
|||
|
to silence the byte compiler. Don't use within `eval-when-compile'."
|
|||
|
`(eval-when-compile
|
|||
|
(if (boundp ',var)
|
|||
|
nil
|
|||
|
(if (not (memq ',var silentcomp-unbound-variables))
|
|||
|
(setq silentcomp-unbound-variables
|
|||
|
(cons ',var silentcomp-unbound-variables)))
|
|||
|
(if (and (silentcomp-is-compiling)
|
|||
|
(not load-in-progress))
|
|||
|
(progn
|
|||
|
(defvar ,var)
|
|||
|
(set ',var (intern (concat "silentcomp-ignore-var:"
|
|||
|
(symbol-name ',var)))))))))
|
|||
|
|
|||
|
(defmacro silentcomp-defun (fun)
|
|||
|
"Bind the symbol as a function during compilation of the file,
|
|||
|
to silence the byte compiler. Don't use within `eval-when-compile'.
|
|||
|
|
|||
|
If the symbol already is bound as a function, it will keep that
|
|||
|
definition. That means that this macro will not shut up warnings
|
|||
|
about incorrect number of arguments. It's dangerous to try to replace
|
|||
|
existing functions since the byte compiler might need the definition
|
|||
|
at compile time, e.g. for macros and inline functions."
|
|||
|
`(eval-when-compile
|
|||
|
(if (not (assq ',fun silentcomp-original-functions))
|
|||
|
(setq silentcomp-original-functions
|
|||
|
(cons (list ',fun
|
|||
|
nil
|
|||
|
(if (fboundp ',fun)
|
|||
|
(symbol-function ',fun)
|
|||
|
'unbound))
|
|||
|
silentcomp-original-functions)))
|
|||
|
(if (and (silentcomp-is-compiling)
|
|||
|
(not load-in-progress)
|
|||
|
(not (fboundp ',fun)))
|
|||
|
(fset ',fun (intern (concat "silentcomp-ignore-fun:"
|
|||
|
(symbol-name ',fun)))))))
|
|||
|
|
|||
|
(defmacro silentcomp-provide (feature)
|
|||
|
"A replacement for the `provide' form that restores the environment
|
|||
|
after the compilation. Don't use within `eval-when-compile'."
|
|||
|
`(progn
|
|||
|
(eval-when-compile (silentcomp-restore-environment))
|
|||
|
(provide ,feature)))
|
|||
|
|
|||
|
(provide 'silentcomp)
|
|||
|
|
|||
|
;;; silentcomp.el ends here
|