branch: elpa/vm
commit 4de80ac0a1687f0db29a65a049f5bcd702a19109
Merge: 64bdc61319 7b794e294c
Author: Mark Diekhans <[email protected]>
Commit: Mark Diekhans <[email protected]>
Merge branch 'main' into 'main'
Fix byte-compile warnings in vm-imap, vm-pop, vm-postpone, vm-rfaddons,
vm-vcard
Closes #320, #472, and #517
See merge request emacs-vm/vm!81
---
Makefile.in | 13 +++++++++----
dev/docs/releasing.org | 4 ++++
lisp/vm-avirtual.el | 12 ++++++++++--
lisp/vm-biff.el | 4 ++++
lisp/vm-build.el | 8 +++++++-
lisp/vm-crypto.el | 2 +-
lisp/vm-folder.el | 25 +++++++++++++++++++++++--
lisp/vm-imap.el | 42 +++++++++++++-----------------------------
lisp/vm-message.el | 6 ++++--
lisp/vm-mime.el | 10 ++++++++++
lisp/vm-misc.el | 11 +++++++++++
lisp/vm-pcrisis.el | 10 +++++++++-
lisp/vm-pop.el | 16 +++++++++-------
lisp/vm-postpone.el | 4 ++--
lisp/vm-reply.el | 10 ++++++++++
lisp/vm-rfaddons.el | 4 ++--
lisp/vm-save.el | 4 ++--
lisp/vm-serial.el | 5 ++++-
lisp/vm-summary.el | 3 +++
lisp/vm-vcard.el | 7 +++++++
20 files changed, 144 insertions(+), 56 deletions(-)
diff --git a/Makefile.in b/Makefile.in
index 9f83055499..8b3945ecd2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -84,11 +84,17 @@ distclean:
#
PACKAGE_INIT = --eval "(progn (require 'package) (package-initialize))"
+# don't try to run in parallel as byte-compile-lint removes .elc files
+lint:
+ ${MAKE} byte-compile-lint
+ ${MAKE} native-compile-lint
+
# byte compile check
+# Note: pgg is deprecated which also generated a warning, so can't generate
errors
byte-compile-lint:
rm -f list/*.elc
$(EMACS_PROG) -batch -Q -L lisp \
- --eval '(setq byte-compile-error-on-warn t)' \
+ --eval '(setq byte-compile-error-on-warn nil)' \
-f batch-byte-compile lisp/*.el
# native compile check
@@ -103,9 +109,8 @@ native-compile-lint:
# check with build-in elint
elint-lint:
- $(EMACS_PROG) -batch -Q -l `pwd`/lisp \
- --eval '(mapc (lambda (f) (message "Checking %s" f) (elint-file f))
\
- (directory-files "lisp" t "\\.el$$"))'
+ $(EMACS_PROG) -batch -Q -L lisp \
+ --eval '(dolist (f (directory-files "lisp" t "\\.el$$")) (message
"Checking %s" f) (elint-file f))'
# check package file with external package-lint
package-lint:
diff --git a/dev/docs/releasing.org b/dev/docs/releasing.org
index c8754cffce..1080c14944 100644
--- a/dev/docs/releasing.org
+++ b/dev/docs/releasing.org
@@ -17,6 +17,10 @@ Once release is made with a release version number (1.2.3)
in vm.el, it will become available as a NonGNU ELPA
package at https://elpa.nongnu.org/nongnu/vm.html
+* check for unexpected warnings
+- make -j 32 # needs generated files
+- make -j 32 lint
+
* use package-lint to check vm.el packages
requires package-lint
make package-lint
diff --git a/lisp/vm-avirtual.el b/lisp/vm-avirtual.el
index 41b097be4c..377817868b 100644
--- a/lisp/vm-avirtual.el
+++ b/lisp/vm-avirtual.el
@@ -115,12 +115,20 @@
;; The following function is erroneously called for fsfemacs as well
(declare-function key-or-menu-binding "vm-xemacs" (key &optional menu-flag))
(declare-function bbdb-get-addresses "ext:bbdb-com"
- (only-first-address
- uninteresting-senders
+ (only-first-address
+ uninteresting-senders
get-header-content-function
&rest get-header-content-function-args))
(declare-function bbdb-search-simple "ext:bbdb" (name net))
+;; vm-save.el function
+(declare-function vm-save-message "vm-save"
+ (folder &optional count mlist quiet))
+
+;; vm-virtual.el function - cyclic dependency
+(declare-function vm-build-virtual-message-list "vm-virtual"
+ (new-messages &optional dont-finalize))
+
; group already defined in vm-vars
;(defgroup vm nil
; "VM"
diff --git a/lisp/vm-biff.el b/lisp/vm-biff.el
index 0fd1101291..3addac708c 100644
--- a/lisp/vm-biff.el
+++ b/lisp/vm-biff.el
@@ -58,6 +58,10 @@
(defvar current-itimer)
(declare-function vm-decode-mime-encoded-words-in-string "vm-mime" (string))
+
+;; X11 display functions
+(declare-function x-display-pixel-width "xfns.c" (&optional terminal))
+(declare-function x-display-pixel-height "xfns.c" (&optional terminal))
(declare-function vm-goto-message "vm-motion" (n))
(declare-function vm-mouse-set-mouse-track-highlight "vm-mouse"
(start end &optional overlay))
diff --git a/lisp/vm-build.el b/lisp/vm-build.el
index 46d942222c..5b87fc1325 100644
--- a/lisp/vm-build.el
+++ b/lisp/vm-build.el
@@ -44,7 +44,13 @@
err
)))
-;; Load byte compile
+;; Declarations for optional/platform-specific functions
+(declare-function cygwin-mount-activate "ext:cygwin-mount" ())
+(declare-function cygwin-mount-convert-file-name "ext:cygwin-mount" (path))
+(declare-function custom-make-dependencies "cus-dep" ())
+(declare-function update-autoloads-from-directories "autoload" (&rest dirs))
+
+;; Load byte compile
(require 'bytecomp)
;; Current public setting
;; Check for undefined functions, ignore save-excursion problems
diff --git a/lisp/vm-crypto.el b/lisp/vm-crypto.el
index 2aa46b7de1..4823f7f89a 100644
--- a/lisp/vm-crypto.el
+++ b/lisp/vm-crypto.el
@@ -148,7 +148,7 @@
;; wait for some output from vm-ssh-remote-command. this
;; ensures that when we return the ssh connection is ready to
;; do port-forwarding.
- (accept-process-output process)
+ (vm-accept-process-output process)
local-port ))
diff --git a/lisp/vm-folder.el b/lisp/vm-folder.el
index 4f85c973be..008f2ad270 100644
--- a/lisp/vm-folder.el
+++ b/lisp/vm-folder.el
@@ -42,10 +42,31 @@
(declare-function set-itimer-restart "vm-xemacs.el" (itimer restart))
(declare-function vm-update-draft-count "vm.el" ())
-(declare-function vm "vm.el"
- (&optional folder
+(declare-function vm "vm.el"
+ (&optional folder
&key read-only access-method reload revisit))
(declare-function vm-mode "vm.el" (&optional read-only))
+(declare-function vm-version "vm.el" ())
+
+;; vm-imap.el functions - cyclic dependency
+(declare-function vm-imap-make-filename-for-spec "vm-imap" (spec))
+(declare-function vm-imap-set-default-attributes "vm-imap" (m))
+(declare-function vm-imap-end-session "vm-imap"
+ (process &optional imap-buffer keep-buffer))
+(declare-function vm-imap-synchronize-folder "vm-imap" t)
+(declare-function vm-imap-find-spec-for-buffer "vm-imap" (buffer))
+(declare-function vm-imap-folder-check-mail "vm-imap" (&optional interactive))
+(declare-function vm-imap-account-name-for-spec "vm-imap" (spec))
+
+;; vm-virtual.el functions - cyclic dependency
+(declare-function vm-virtual-quit "vm-virtual" (&optional no-expunge
no-change))
+(declare-function vm-virtual-save-folder "vm-virtual" (prefix))
+(declare-function vm-virtual-get-new-mail "vm-virtual" ())
+(declare-function vm-build-virtual-message-list "vm-virtual"
+ (new-messages &optional dont-finalize))
+
+;; vm-mark.el function
+(declare-function vm-marked-messages "vm-mark" ())
;; Operations for vm-folder-access-data
diff --git a/lisp/vm-imap.el b/lisp/vm-imap.el
index 1c9f55f28b..5ad9b2c54b 100644
--- a/lisp/vm-imap.el
+++ b/lisp/vm-imap.el
@@ -45,6 +45,7 @@
;; (retry nil)))
(defvar selectable-only) ;; FIXME: Add `vm-' prefix!
+(defvar auth-sources) ;; from auth-source.el, used for dynamic binding
;;; To-Do (USR)
;; - Need to ensure that new imap sessions get created as and when needed.
@@ -457,25 +458,13 @@ for accessing MAILBOX."
(defsubst vm-imap-auth-method (auth)
(memq auth vm-imap-auth-methods))
-(defsubst vm-accept-process-output (process)
- "Accept output from PROCESS.
-
+(defun vm-imap-accept-process-output (process)
+ "Accept output from PROCESS for IMAP operations.
The variable `vm-imap-server-timeout' specifies how many seconds
-to wait before timing out. If a timeout occurs, an exception is
-thrown. In such a situation, typically VM cannot proceed."
- ;; protect against possible buffer change due to bug in Emacs
- (let ((buf (current-buffer))
- (got-output (accept-process-output process vm-imap-server-timeout)))
- (if got-output
- (when (not (equal (current-buffer) buf))
- (when (string-lessp "24" emacs-version)
- ;; the Emacs bug should have been fixed in version 24
- (vm-warn 0 2
- "Emacs process output error: Buffer changed to %s"
- (current-buffer)))
- ;; recover from the bug
- (set-buffer buf))
- (vm-imap-protocol-error "Timed out for response from the IMAP server"))))
+to wait before timing out. If a timeout occurs, a protocol error
+is signaled."
+ (unless (vm-accept-process-output process vm-imap-server-timeout)
+ (vm-imap-protocol-error "Timed out for response from the IMAP server")))
;; (defvar vm-imap-connection-mode 'online) ; moved to vm-vars.el
@@ -1175,7 +1164,7 @@ Returns the process or nil if the session could not be
created."
protocol (car source-list)
host (nth 1 source-list)
port (nth 2 source-list)
- ;; mailbox (nth 3 source-list)
+ mailbox (nth 3 source-list)
auth (nth 4 source-list)
user (nth 5 source-list)
pass (nth 6 source-list)
@@ -1548,11 +1537,6 @@ as well."
(if (not (= (point) (point-max)))
(vm-imap-log-tokens (list 'send1 (point) (point-max))))
(goto-char (point-max))
- ;; try if it makes a difference to get pending output here, use timeout
- ;; (accept-process-output process 0 0.01)
- ;; (if (not (= (point) (point-max)))
- ;; (vm-imap-log-tokens (list 'send2 (point) (point-max))))
- ;; (goto-char (point-max))
(unless no-tag (insert-before-markers (or tag "VM") " "))
(let ((case-fold-search t))
@@ -2311,7 +2295,7 @@ May throw exceptions."
(setq opoint (point))
(vm-imap-check-connection process)
;; point might change here?
- (vm-accept-process-output process)
+ (vm-imap-accept-process-output process)
(goto-char opoint))
((looking-at "\r\n")
(forward-char 2)
@@ -2380,7 +2364,7 @@ May throw exceptions."
(while (< (- (point-max) start) n-octets)
(vm-imap-check-connection process)
;; point might change here? USR, 2011-03-16
- (vm-accept-process-output process))
+ (vm-imap-accept-process-output process))
(goto-char (+ start n-octets))
(setq token (list 'string start (point))
done t)))
@@ -2400,7 +2384,7 @@ May throw exceptions."
(forward-char 1))
(vm-imap-check-connection process)
;; point might change here?
- (vm-accept-process-output process)
+ (vm-imap-accept-process-output process)
(goto-char curpoint))
(setq token (list 'string start curpoint)))))
;; should be (looking-at "[\000-\040\177-\377]")
@@ -2429,7 +2413,7 @@ May throw exceptions."
(setq done t)
(vm-imap-check-connection process)
;; point might change here?
- (vm-accept-process-output process)
+ (vm-imap-accept-process-output process)
(goto-char curpoint))
(vm-imap-log-token (buffer-substring start curpoint))
(setq token (list 'atom start curpoint)))))))
@@ -4667,7 +4651,7 @@ May throw exceptions."
(mailboxes nil)
(fcc-string (vm-mail-get-header-contents "FCC:" ","))
fcc-list fcc maildrop spec-list
- process flags string m ;; response
+ process (flags nil) string m ;; response
(vm-imap-ok-to-ask t))
(if (null mailbox)
(setq mailboxes nil)
diff --git a/lisp/vm-message.el b/lisp/vm-message.el
index 29ea1a82cf..cacc51876d 100644
--- a/lisp/vm-message.el
+++ b/lisp/vm-message.el
@@ -442,6 +442,10 @@ works in all VM buffers."
(defsubst vm-set-thread-indentation-offset-of (message offset)
(aset (aref message 1) 22 offset))
+;; Defined here early because it's used by vm-set-edited-flag-of below
+(defsubst vm-set-stuff-flag-of (message val)
+ (aset (aref message 4) 2 val))
+
;; The other routines in attributes group are part of the undo system.
(defun vm-set-edited-flag-of (message flag)
(aset (aref message 2) 7 flag)
@@ -557,8 +561,6 @@ works in all VM buffers."
(set (aref (aref message 4) 1) list))
(defsubst vm-set-virtual-messages-sym-of (message sym)
(aset (aref message 4) 1 sym))
-(defsubst vm-set-stuff-flag-of (message val)
- (aset (aref message 4) 2 val))
(defsubst vm-set-decoded-labels-of (message labels)
(aset (aref message 4) 3 labels))
(defalias 'vm-set-labels-of 'vm-set-decoded-labels-of)
diff --git a/lisp/vm-mime.el b/lisp/vm-mime.el
index 62b992cc5d..8a08c363e4 100644
--- a/lisp/vm-mime.el
+++ b/lisp/vm-mime.el
@@ -66,6 +66,16 @@
(declare-function vm-imagemagick-call-convert "vm-misc" (infile buffer args))
(declare-function vm-imagemagick-convert-shell-command "vm-misc" ())
+;; vm-digest.el functions - cyclic dependency
+(declare-function vm-mime-encapsulate-messages "vm-digest" t)
+(declare-function vm-mime-burst-layout "vm-digest" (layout ident-header))
+
+;; vm-edit.el function
+(declare-function vm-discard-cached-data "vm-edit" (&optional count))
+
+;; Image cache function
+(declare-function clear-image-cache "image.c" (&optional filter))
+
(defvar enable-multibyte-characters)
;; The following variables are defined in the code, depending on the
diff --git a/lisp/vm-misc.el b/lisp/vm-misc.el
index a1b35510ba..b4ff1d7ea2 100644
--- a/lisp/vm-misc.el
+++ b/lisp/vm-misc.el
@@ -30,6 +30,9 @@
;; vm-xemacs.el is a fake file to fool the Emacs 23 compiler
(declare-function find-coding-system "vm-xemacs" (coding-system-or-name))
(declare-function map-extents "vm-xemacs" (function &optional buffer from to))
+(declare-function focus-frame "vm-xemacs" (frame))
+(declare-function char-to-int "vm-xemacs" (char))
+(declare-function scroll-bar-mode "scroll-bar" (&optional arg))
;; Aliases for xemacs/fsfemacs functions with different arguments
;; (declare-function vm-interactive-p "vm-misc.el"
@@ -86,6 +89,14 @@ message."
(defsubst vm-garbage-collect ()
(pp (vm-zip-lists gc-fields (garbage-collect))))
+(defun vm-accept-process-output (process &optional timeout)
+ "Accept output from PROCESS, optionally with TIMEOUT seconds.
+Binds `inhibit-quit' to nil to allow user interrupts and avoid
+the \"Blocking call to accept-process-output with quit inhibited\" warning.
+Returns non-nil if output was received, nil on timeout."
+ (let ((inhibit-quit nil))
+ (accept-process-output process timeout)))
+
;; Make sure that interprogram-cut-function is defined
(unless (boundp 'interprogram-cut-function)
(defvar interprogram-cut-function nil))
diff --git a/lisp/vm-pcrisis.el b/lisp/vm-pcrisis.el
index b41a4a458b..9063b41a97 100644
--- a/lisp/vm-pcrisis.el
+++ b/lisp/vm-pcrisis.el
@@ -45,9 +45,17 @@
(eval-when-compile (require 'vm-macro))
(declare-function set-extent-face "vm-xemacs" (extent face))
-(declare-function timezone-absolute-from-gregorian "ext:timezone"
+(declare-function timezone-absolute-from-gregorian "ext:timezone"
(month day year))
(declare-function bbdb-buffer "ext:bbdb" ())
+(declare-function bbdb-record-putprop "ext:bbdb" (record property value))
+(declare-function bbdb-save-db "ext:bbdb" (&optional postprocess))
+(declare-function bbdb-record-net "ext:bbdb" (record))
+(declare-function bbdb-get-field "ext:bbdb-com" (record field &optional
yet-another))
+(declare-function bbdb-search "ext:bbdb" (records &optional name company net
notes phone))
+(declare-function bbdb-create-internal "ext:bbdb" (&rest args))
+;; bbdb-with-db-buffer is a macro, declare it to suppress warning
+(declare-function bbdb-with-db-buffer "ext:bbdb" t)
(declare-function vm-imap-account-name-for-spec "vm-imap" (maildrop-spec))
(declare-function vm-pop-find-name-for-spec "vm-pop" (maildrop-spec))
diff --git a/lisp/vm-pop.el b/lisp/vm-pop.el
index f91a173587..4053254eb7 100644
--- a/lisp/vm-pop.el
+++ b/lisp/vm-pop.el
@@ -32,11 +32,13 @@
(require 'vm-mime)
(eval-when-compile (require 'cl-lib))
-(declare-function vm-submit-bug-report
+(declare-function vm-submit-bug-report
"vm.el" (&optional pre-hooks post-hooks))
-(declare-function open-network-stream
+(declare-function open-network-stream
"subr.el" (name buffer host service &rest parameters))
+(defvar auth-sources) ;; from auth-source.el, used for dynamic binding
+
(if (fboundp 'define-error)
(progn
(define-error 'vm-cant-uidl "Can't use UIDL")
@@ -790,7 +792,7 @@ killed as well."
(goto-char vm-pop-read-point)
(while (not (search-forward "\r\n" nil t))
(vm-pop-check-connection process)
- (accept-process-output process)
+ (vm-accept-process-output process)
(goto-char vm-pop-read-point))
(setq match-end (point))
(goto-char vm-pop-read-point)
@@ -810,7 +812,7 @@ killed as well."
;; save-excursion doesn't work right
(let ((opoint (point)))
(vm-pop-check-connection process)
- (accept-process-output process)
+ (vm-accept-process-output process)
(goto-char opoint)))
(setq vm-pop-read-point (point))))
@@ -839,7 +841,7 @@ killed as well."
;; save-excursion doesn't work right
(let ((opoint (point)))
(vm-pop-check-connection process)
- (accept-process-output process)
+ (vm-accept-process-output process)
(goto-char opoint)))
(setq vm-pop-read-point (point-marker))
(goto-char start)
@@ -944,7 +946,7 @@ popdrop
(vm-pop-report-retrieval-status statblob)))))))
(after-change-functions (cons func after-change-functions)))
(vm-pop-check-connection process)
- (accept-process-output process)
+ (vm-accept-process-output process)
(goto-char opoint)))
(vm-set-pop-stat-x-need statblob nil)
(setq vm-pop-read-point (point-marker))
@@ -1048,7 +1050,7 @@ popdrop
;; save-excursion doesn't work right
(let ((opoint (point)))
(vm-pop-check-connection process)
- (accept-process-output process)
+ (vm-accept-process-output process)
(goto-char opoint)))
(setq vm-pop-read-point (point-marker))
(goto-char start)
diff --git a/lisp/vm-postpone.el b/lisp/vm-postpone.el
index 532589d7bb..8c2af34a53 100644
--- a/lisp/vm-postpone.el
+++ b/lisp/vm-postpone.el
@@ -941,7 +941,7 @@ See the variable `vm-mail-priority'."
vm-auto-folder-alist)
"Like `vm-auto-folder-alist' but for outgoing messages.
It should be fed to `vm-mail-select-folder'."
- :type 'list
+ :type 'sexp
:group 'vm-postpone)
;;;###autoload
@@ -954,7 +954,7 @@ By reordering the elements of this list or adding own
functions you
can control the behavior of vm-mail-fcc and `vm-mail-auto-fcc'.
You may allow a sophisticated decision for the right folder for your
outgoing message."
- :type 'list
+ :type 'sexp
:group 'vm-postpone)
;;;###autoload
diff --git a/lisp/vm-reply.el b/lisp/vm-reply.el
index a6f35c10ca..2008309d87 100644
--- a/lisp/vm-reply.el
+++ b/lisp/vm-reply.el
@@ -72,8 +72,18 @@
(declare-function vm-mode "vm" (&optional read-only))
(declare-function vm-session-initialization "vm" ())
+(declare-function vm-version "vm" ())
(declare-function get-itimer "vm-xemacs.el" (name))
+;; vm-digest.el functions - cyclic dependency
+(declare-function vm-no-frills-encapsulate-message "vm-digest"
+ (m keep-list discard-regexp))
+(declare-function vm-mime-encapsulate-messages "vm-digest" t)
+(declare-function vm-rfc934-encapsulate-messages "vm-digest"
+ (message-list keep-list discard-regexp))
+(declare-function vm-rfc1153-encapsulate-messages "vm-digest"
+ (message-list keep-list discard-regexp))
+
(declare-function mail-strip-quoted-names "ext:mail-utils" (address))
(declare-function mail-fetch-field "ext:mail-utils"
(field-name &optional last all list))
diff --git a/lisp/vm-rfaddons.el b/lisp/vm-rfaddons.el
index fd27eff411..ef04919476 100644
--- a/lisp/vm-rfaddons.el
+++ b/lisp/vm-rfaddons.el
@@ -146,7 +146,7 @@ nil. (Rob F)"
(vm-mime-auto-save-all-attachments-delete-external m)))
;;;###autoload
-(defun vm-rfaddons-infect-vm (&optional sit-for
+(defun vm-rfaddons-infect-vm (&optional _sit-for
option-list exclude-option-list)
"This function will setup the key bindings, advices and hooks
necessary to use all the function of vm-rfaddons.el.
@@ -1388,7 +1388,7 @@ text/alternative message depending on the value of the
variable
(setq end (point-marker))
(insert "--" boundary "--\n")))
- (if qp-encoded (vm-mime-qp-decode-region start end))
+ (if qp-encoded (quoted-printable-decode-region start end))
(goto-char body)
(if (stringp vm-assimilate-html-command)
diff --git a/lisp/vm-save.el b/lisp/vm-save.el
index 5fb7b40dce..05db7a4bb9 100644
--- a/lisp/vm-save.el
+++ b/lisp/vm-save.el
@@ -809,9 +809,9 @@ arguments after the command finished."
(process-send-eof process)
- (when (not no-wait)
+ (when (not no-wait)
(while (and (eq 'run (process-status process)))
- (accept-process-output process)
+ (vm-accept-process-output process)
(sit-for 0))
(vm-pipe-command-exit-handler process command discard-output))
buffer))
diff --git a/lisp/vm-serial.el b/lisp/vm-serial.el
index f7e3c23715..56f717df10 100644
--- a/lisp/vm-serial.el
+++ b/lisp/vm-serial.el
@@ -85,8 +85,11 @@
"Sending personalized serial mails and getting message templates."
:group 'vm-ext)
-(declare-function bbdb-extract-address-components
+(declare-function bbdb-extract-address-components
"ext:bbdb-snarf" (adstring &optional ignore-errors))
+
+;; XEmacs function
+(declare-function read-expression "vm-xemacs" (prompt &optional
initial-contents))
(declare-function bbdb-record-firstname "ext:bbdb" (record))
(declare-function bbdb-record-lastname "ext:bbdb" (record))
(declare-function bbdb-search-simple "ext:bbdb" (name net))
diff --git a/lisp/vm-summary.el b/lisp/vm-summary.el
index e74ce2c151..9f7cb9b2a7 100644
--- a/lisp/vm-summary.el
+++ b/lisp/vm-summary.el
@@ -38,6 +38,9 @@
(declare-function vm-sort-messages "vm-sort.el"
(keys &optional lets-get-physical))
+;; vm-imap.el function
+(declare-function vm-imap-folder-for-spec "vm-imap" (spec))
+
(defvar scrollbar-height) ; defined for XEmacs
diff --git a/lisp/vm-vcard.el b/lisp/vm-vcard.el
index 0acd0e654f..29c43a6742 100644
--- a/lisp/vm-vcard.el
+++ b/lisp/vm-vcard.el
@@ -34,6 +34,13 @@
(require 'vm-misc)
(vm-load-features-silent-when-compiling '(vcard)))
+(defvar vcard-pretty-print-function) ;; from vcard.el, used for dynamic
binding
+
+;; vcard.el functions
+(declare-function vcard-pretty-print "ext:vcard" (vcard))
+(declare-function vcard-parse-string "ext:vcard" (string &optional filter))
+(declare-function vcard-format-sample-string "ext:vcard" (vcard))
+
(and (boundp 'vcard-api-version) (string-lessp vcard-api-version "2.0")
(error "vm-vcard.el requires vcard API version 2.0 or later."))