Package: dh-make Version: 0.60 Severity: normal Tags: patch The emacsen-startup.ex template in dh_make generates packages which violate the Debian emacs policy in two respects:
1. They rely on the variable "flavor" being bound to the current emacs flavor, but the policy doesn't guarantee this anywhere (it doesn't even mention a variable called "flavor"). 2. They modify the variable "load-path" directly, which the policy prohibits. These problems are described in (much) more detail below. The attached patch fixes both these issues. re 1: The policy only mentions the variable "debian-emacs-flavor": Each emacs binary must set the variable debian-emacs-flavor to be the same as the name of the debian-package. (<http://www.debian.org/doc/packaging-manuals/debian-emacs-policy> section 2) Thus the packages which dh_make generates should refer to debian-emacs-flavor instead of flavor. It's not immediately clear why the current use of "flavor" instead of "debian-emacs-flavor" in emacsen-startup.ex even works; AFAICT it's because the startup files are loaded by the function "debian-run-directories" in debian-startup.el, which is called by the function "debian-startup" (also in debian-startup.el), which is passed the intended value of "debian-emacs-flavor" as an argument. "debian-startup" is defined (defun debian-startup (flavor) [...]) Thus "flavor" is bound to the current emacs flavor within the body of the debian-startup function, and because emacs lisp is dynamically scoped, all the functions invoked in the body of debian-startup inherit that binding. But relying on this behavior is a very bad idea: If the flavor argument to debian-startup is renamed, all the packages relying on this undocumented behavior will break. (They would also break if debian-startup.el were to start using lexical scoping, which will be available as an option in the next version of emacs.) re 2: Debian emacs policy says: Emacs add-on packages may not modify load-path directly. They must use (debian-pkg-add-load-path-item <path>). This function will make sure that their additions end up in the right place -- before the emacs system directories, but after the /usr/local/ directories. Also, add-on packages will need to either check (fboundp 'debian-pkg-add-load-path-item) before calling this function, or add a dependency on emacsen-common (>= 1.4.14). (<http://www.debian.org/doc/packaging-manuals/debian-emacs-policy> section 9) However, the emacsen-startup.ex template *does* modify the load-path directly; it should use debian-pkg-add-load-path-item instead.
--- a/lib/debian/emacsen-startup.ex +++ b/lib/debian/emacsen-startup.ex @@ -13,12 +13,14 @@ ;; installed in a subdirectory of the respective site-lisp directory. ;; We have to add this to the load-path: (let ((package-dir (concat "/usr/share/" - (symbol-name flavor) + (symbol-name debian-emacs-flavor) "/site-lisp/#PACKAGE#"))) ;; If package-dir does not exist, the #PACKAGE# package must have ;; removed but not purged, and we should skip the setup. (when (file-directory-p package-dir) - (setq load-path (cons package-dir load-path)) + (if (fboundp 'debian-pkg-add-load-path-item) + (debian-pkg-add-load-path-item package-dir) + (setq load-path (cons package-dir load-path))) (autoload '#PACKAGE#-mode "#PACKAGE#-mode" "Major mode for editing #PACKAGE# files." t) (add-to-list 'auto-mode-alist '("\\.#PACKAGE#$" . #PACKAGE#-mode))))