--- emacs/lisp/emacs-lisp/package.el 2021-08-13 19:52:44.647493393 +0200 +++ package.el 2021-08-20 23:13:36.621235559 +0200 @@ -396,6 +396,15 @@ :version "25.1" :type '(repeat symbol)) +(defcustom package-install-local-multifile-packages-symlinked t + "Non-nil means to place a symlink to original package directory location in +`package-user-dir' reather then copy files to a subfolder of + `package-user-dir'. This option is meant for pacakge developers rather than + ordinary users." + :type '(boolean) + :risky t + :version "28.1") + (defcustom package-native-compile nil "Non-nil means to native compile packages on installation." :type '(boolean) @@ -954,19 +963,22 @@ (pkg-dir (expand-file-name dirname package-user-dir))) (pcase (package-desc-kind pkg-desc) ('dir - (make-directory pkg-dir t) - (let ((file-list - (directory-files - default-directory 'full "\\`[^.].*\\.el\\'" 'nosort))) - (dolist (source-file file-list) - (let ((target-el-file - (expand-file-name (file-name-nondirectory source-file) pkg-dir))) - (copy-file source-file target-el-file t))) - ;; Now that the files have been installed, this package is - ;; indistinguishable from a `tar' or a `single'. Let's make - ;; things simple by ensuring we're one of them. - (setf (package-desc-kind pkg-desc) - (if (> (length file-list) 1) 'tar 'single)))) + (if package-install-local-multifile-packages-symlinked + (make-symbolic-link (expand-file-name default-directory) pkg-dir t) + (progn + (make-directory pkg-dir t) + (let ((file-list + (directory-files + default-directory 'full "\\`[^.].*\\.el\\'" 'nosort))) + (dolist (source-file file-list) + (let ((target-el-file + (expand-file-name (file-name-nondirectory source-file) pkg-dir))) + (copy-file source-file target-el-file t))) + ;; Now that the files have been installed, this package is + ;; indistinguishable from a `tar' or a `single'. Let's make + ;; things simple by ensuring we're one of them. + (setf (package-desc-kind pkg-desc) + (if (> (length file-list) 1) 'tar 'single)))))) ('tar (make-directory package-user-dir t) (let* ((default-directory (file-name-as-directory package-user-dir)))