GNU bug report logs - #37527
[PATCH] Install C source code for for debugging help

Previous Next

Package: emacs;

Reported by: Paul Eggert <eggert <at> cs.ucla.edu>

Date: Thu, 26 Sep 2019 20:09:01 UTC

Severity: wishlist

Full log


View this message in rfc822 format

From: help-debbugs <at> gnu.org (GNU bug Tracking System)
To: Paul Eggert <eggert <at> cs.ucla.edu>
Subject: bug#37527: closed (Re: bug#37527: [PATCH] Install C source code
 for for debugging help)
Date: Sat, 25 Jan 2020 00:49:02 +0000
[Message part 1 (text/plain, inline)]
Your bug report

#37527: [PATCH] Install C source code for for debugging help

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to 37527 <at> debbugs.gnu.org.

-- 
37527: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=37527
GNU Bug Tracking System
Contact help-debbugs <at> gnu.org with problems
[Message part 2 (message/rfc822, inline)]
From: Paul Eggert <eggert <at> cs.ucla.edu>
To: Eli Zaretskii <eliz <at> gnu.org>
Cc: michael.albinus <at> gmx.de, 37527-done <at> debbugs.gnu.org, stefan <at> marxist.se,
 rgm <at> gnu.org
Subject: Re: bug#37527: [PATCH] Install C source code for for debugging help
Date: Fri, 24 Jan 2020 16:47:49 -0800
[Message part 3 (text/plain, inline)]
On 1/23/20 10:24 AM, Eli Zaretskii wrote:

> In that case, I will repeat my suggestion to have a separate variable
> for the installed sources, because otherwise we are making an
> incompatible behavior change.

OK, I did it that way by installing the attached patch instead; the new 
separate variable is 'emacs-source-directory'.
[0001-Install-C-source-code-for-C-h-f-etc.patch (text/x-patch, attachment)]
[Message part 5 (message/rfc822, inline)]
From: Paul Eggert <eggert <at> cs.ucla.edu>
To: bug-gnu-emacs <at> gnu.org
Cc: Paul Eggert <eggert <at> cs.ucla.edu>
Subject: [PATCH] Install C source code for for debugging help
Date: Thu, 26 Sep 2019 13:07:52 -0700
Without this change, on typical GNU/Linux distributions
like Debian, the first button of ‘C-h f car RET’ does not
work because the source code for ‘car’ is not installed.
Fix this by installing the (compressed) C source code along with
the (compressed) Lisp source code that is already installed.
This adds about 3 MB (about 2%) to the size of the installed files
on my platform.
* Makefile.in (install_srcdir, enable_install_srcdir):
New macros.
(epaths-force): Substitute PATH_SOURCE too.
(exp_sourcesrcdir): Install copy of C source code if
enable_install_srcdir says to.
* configure.ac (install_srcdir): New var.
Add support for --disable-install-srcdir (to disable installation
of source) and for --enable-install-srcdir='.' (to have Emacs
refer to its source dir).
* lisp/emacs-lisp/find-func.el (find-function-C-source):
Also look for gzipped source files.
* src/emacs.c (init_cmdargs): Set source-directory to
be the same as installation-directory when
running with an uninstalled Emacs.
* src/epaths.in (PATH_SOURCE): New macro.
* src/lread.c (syms_of_lread): When initializing
source-directory, use PATH_SOURCE as-is if it is absolute;
otherwise, use it relative to PATH_DUMPLOADSEARCH/.. as	before.
---
 Makefile.in                  | 25 +++++++++++++++++++++++++
 configure.ac                 | 19 +++++++++++++++++++
 etc/NEWS                     |  6 ++++++
 lisp/emacs-lisp/find-func.el |  5 ++++-
 src/emacs.c                  |  2 ++
 src/epaths.in                |  3 +++
 src/lread.c                  |  8 ++++++--
 7 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/Makefile.in b/Makefile.in
index aa11e6b0b7..6ffb8eb747 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -266,6 +266,10 @@ etcdir=
 # once.
 archlibdir=@archlibdir@
 
+# Where to put installed source code, and whether to install it at all.
+install_srcdir=@install_srcdir@
+enable_install_srcdir=@enable_install_srcdir@
+
 # Where to put the etc/DOC file.
 etcdocdir=@etcdocdir@
 
@@ -374,6 +378,7 @@ epaths-force:
 	  -e 's;\(#.*PATH_BITMAPS\).*$$;\1 "${bitmapdir}";'		\
 	  -e 's;\(#.*PATH_X_DEFAULTS\).*$$;\1 "${x_default_search_path}";' \
 	  -e 's;\(#.*PATH_GAME\).*$$;\1 $(PATH_GAME);'			\
+	  -e 's;\(#.*PATH_SOURCE\).*$$;\1 "${install_srcdir}";'	\
 	  -e 's;\(#.*PATH_DOC\).*$$;\1 "${etcdocdir}";') &&		\
 	${srcdir}/build-aux/move-if-change epaths.h.$$$$ src/epaths.h
 
@@ -624,6 +629,26 @@ install-arch-indep:
 	  done; \
 	  ${GZIP_PROG} -9n "../etc/publicsuffix.txt"; \
 	}
+ifneq ($(enable_install_srcdir),no)
+	-unset CDPATH; \
+	umask 022; $(MKDIR_P) "$(DESTDIR)$(install_srcdir)/src" && \
+	exp_sourcesrcdir=`cd "$(DESTDIR)$(install_srcdir)/src" && /bin/pwd` && \
+	[ "`cd $(srcdir)/src && /bin/pwd`" = "$$exp_sourcesrcdir" ] || { \
+	  $(set_installuser); \
+	  printf 'Copying compressed C sources to %s ...\n' \
+		 "$(DESTDIR)$(install_srcdir)/src"; \
+	  for file in `cd $(srcdir) && echo src/*.[cm]`; do \
+	    installed_file="$(DESTDIR)$(install_srcdir)/$$file" && \
+	    $(INSTALL_DATA) "$$file" "$$installed_file" && \
+	    [ -z "$(GZIP_PROG)" ] || { \
+	      rm -f "$$installed_file.gz" && \
+	      $(GZIP_PROG) -9n "$$installed_file" && \
+	      installed_file=$$installed_file.gz; \
+	    } || exit; \
+	    chown $$installuser "$$installed_file" || true; \
+	  done; \
+	}
+endif
 	-chmod -R a+r "$(DESTDIR)${datadir}/emacs/${version}" ${COPYDESTS}
 
 ## The above chmods are needed because "umask 022; tar ..." is not
diff --git a/configure.ac b/configure.ac
index 7435f2e8da..ac50e6e297 100644
--- a/configure.ac
+++ b/configure.ac
@@ -194,6 +194,7 @@
 lisppath='${locallisppath}:${standardlisppath}'
 etcdir='${datadir}/emacs/${version}/etc'
 archlibdir='${libexecdir}/emacs/${version}/${configuration}'
+install_srcdir='${datadir}/emacs/${version}'
 etcdocdir='${datadir}/emacs/${version}/etc'
 gamedir='${localstatedir}/games/emacs'
 
@@ -540,6 +541,21 @@ AC_DEFUN
   locallisppath=${enableval} locallisppathset=yes
 fi)
 
+AC_ARG_ENABLE([install-srcdir],
+  [AS_HELP_STRING([--disable-install-srcdir],
+     [do not install low-level Emacs source code useful for debugging.
+      Use '--enable-install-srcdir=.' to have Emacs refer to the
+      source directory it was configured from.])],
+  [],
+  [enable_install_srcdir=yes])
+case $enable_install_srcdir in
+  yes | no) ;;
+  .) install_srcdir=`cd "$srcdir" && /bin/pwd` ||
+       AC_MSG_ERROR([cannot get srcdir name])
+     enable_install_srcdir=no;;
+  *) AC_MSG_ERROR([invalid install-srcdir]);;
+esac
+
 AC_ARG_ENABLE(checking,
 [AS_HELP_STRING([--enable-checking@<:@=LIST@:>@],
 		[enable expensive checks.  With LIST,
@@ -2061,6 +2077,7 @@ AC_DEFUN
      dnl This one isn't really used, only archlibdir is.
      libexecdir="\${ns_appbindir}/libexec"
      archlibdir="\${ns_appbindir}/libexec"
+     install_srcdir="\${ns_appresdir}"
      etcdocdir="\${ns_appresdir}/etc"
      etcdir="\${ns_appresdir}/etc"
      dnl FIXME maybe set datarootdir instead.
@@ -5211,6 +5228,8 @@ AC_DEFUN
 AC_SUBST(x_default_search_path)
 AC_SUBST(etcdir)
 AC_SUBST(archlibdir)
+AC_SUBST([enable_install_srcdir])
+AC_SUBST([install_srcdir])
 AC_SUBST(etcdocdir)
 AC_SUBST(bitmapdir)
 AC_SUBST(gamedir)
diff --git a/etc/NEWS b/etc/NEWS
index 0a4ada3cc6..7643905256 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -125,6 +125,12 @@ removed configure options.)
 ** The distribution tarball now has test cases; 'make check' runs them.
 This is intended mostly to help developers.
 
+---
+** Emacs now installs a copy of its C source code, used for debugging help.
+For example, pressing the first button in the *Help* buffer generated
+by 'C-h f car RET' now takes you to a copy of the C-language
+implementation of the function 'car'.
+
 ---
 ** Emacs now requires GTK 2.24 and GTK 3.10 for the GTK 2 and GTK 3
 builds respectively.
diff --git a/lisp/emacs-lisp/find-func.el b/lisp/emacs-lisp/find-func.el
index 142c99edd4..2812ae6f22 100644
--- a/lisp/emacs-lisp/find-func.el
+++ b/lisp/emacs-lisp/find-func.el
@@ -245,7 +245,10 @@ find-function-C-source
   (let ((dir (or find-function-C-source-directory
                  (read-directory-name "Emacs C source dir: " nil nil t))))
     (setq file (expand-file-name file dir))
-    (if (file-readable-p file)
+    (if (or (file-readable-p file)
+	    (let ((file-gz (concat file ".gz")))
+	      (and (file-readable-p file-gz)
+		   (setq file file-gz))))
         (if (null find-function-C-source-directory)
             (setq find-function-C-source-directory dir))
       (error "The C source file %s is not available"
diff --git a/src/emacs.c b/src/emacs.c
index 21a05d337e..fa547b59f5 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -522,6 +522,7 @@ init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
 	      if (!NILP (etc_exists))
 		{
                   Vinstallation_directory = Ffile_name_as_directory (dir);
+		  Vsource_directory = Vinstallation_directory;
 		  break;
 		}
 	    }
@@ -547,6 +548,7 @@ init_cmdargs (int argc, char **argv, int skip_args, char const *original_pwd)
 		{
 		  tem = Fexpand_file_name (build_string (".."), dir);
                   Vinstallation_directory = Ffile_name_as_directory (tem);
+		  Vsource_directory = Vinstallation_directory;
 		  break;
 		}
 	    }
diff --git a/src/epaths.in b/src/epaths.in
index 5fe35b64c8..4e15c3a3d6 100644
--- a/src/epaths.in
+++ b/src/epaths.in
@@ -73,5 +73,8 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 /* Where Emacs should store game score files.  */
 #define PATH_GAME "/usr/local/var/games/emacs"
 
+/* Where Emacs should look for installed sources.  */
+#define PATH_SOURCE "/usr/local/share/emacs"
+
 /* Where Emacs should look for the application default file. */
 #define PATH_X_DEFAULTS "/usr/lib/X11/%L/%T/%N%C%S:/usr/lib/X11/%l/%T/%N%C%S:/usr/lib/X11/%T/%N%C%S:/usr/lib/X11/%L/%T/%N%S:/usr/lib/X11/%l/%T/%N%S:/usr/lib/X11/%T/%N%S"
diff --git a/src/lread.c b/src/lread.c
index 5000b38a01..849632a7ec 100644
--- a/src/lread.c
+++ b/src/lread.c
@@ -4979,9 +4979,13 @@ syms_of_lread (void)
   DEFVAR_LISP ("source-directory", Vsource_directory,
 	       doc: /* Directory in which Emacs sources were found when Emacs was built.
 You cannot count on them to still be there!  */);
+  char const *path_source = PATH_SOURCE;
   Vsource_directory
-    = Fexpand_file_name (build_string ("../"),
-			 Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH, 0)));
+    = (file_name_absolute_p (path_source)
+       ? build_string (path_source)
+       : Fexpand_file_name (build_string ("../" PATH_SOURCE),
+			    Fcar (decode_env_path (0, PATH_DUMPLOADSEARCH,
+						   false))));
 
   DEFVAR_LISP ("preloaded-file-list", Vpreloaded_file_list,
 	       doc: /* List of files that were preloaded (when dumping Emacs).  */);
-- 
2.21.0




This bug report was last modified 4 years and 311 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.