unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Paul Eggert <eggert@cs.ucla.edu>
To: Philipp Stephani <p.stephani2@gmail.com>, Eli Zaretskii <eliz@gnu.org>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH PING] Honor 'SOURCE_DATE_EPOCH' when generating autoloads.
Date: Sun, 27 Dec 2015 15:26:28 -0800	[thread overview]
Message-ID: <568073A4.3010604@cs.ucla.edu> (raw)
In-Reply-To: <CAArVCkTi6wJiZtDaG2jJrb8deaXsK=w_ei_FmWaXc4fyT0+yGA@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 1161 bytes --]

Philipp Stephani wrote:
> It would be great to defer
> the discussion about naming, string vs. nil etc. until later so that this
> project can make progress; there's still enough time to discuss until the
> changes get releases.

Better yet, let's just get that stuff done now. I'm attaching a followup that I 
hope works well enough. The first patch is a copy of yours, except with the 
commit message reformatted a bit for Emacs standards. The second patch is the 
followup. The third patch is the two patches combined; this should be easier to 
review than looking at the individual patches.

The basic ideas behind the second patch:

* Document the changes in etc/NEWS and in the relevant part of the manual.

* Use "deterministic-build", not "deterministic-dump", for the name. I didn't 
understand the need for two variables here; we can add another one if needed.

* Represent unknown values with nil, not with magic strings like "elided" or 
"unknown".

* Make emacs-build-time deterministic, too.

* Adjust the output of emacs-version and similar functions to omit the build date.

* Remove what appears to be an unnecessary initialization in 'main'.


[-- Attachment #2: 0001-Remove-build-system-name-from-deterministic-dumps.patch --]
[-- Type: text/x-diff, Size: 4325 bytes --]

From a6364c408a156a413d1833992790877f974187d1 Mon Sep 17 00:00:00 2001
From: Philipp Stephani <phst@google.com>
Date: Sun, 20 Dec 2015 01:57:34 +0100
Subject: [PATCH 1/2] Remove build system name from deterministic dumps

* configure.ac (DETERMINISTIC_DUMP): New configuration option.
* lisp/version.el (emacs-build-time): Add a comment to make the
build time deterministic if requested.
(emacs-build-system): Make variable deterministic if requested.
* src/emacs.c (main): Initialize `deterministic-dump' from the
configuration option.
(syms_of_emacs): New constant `deterministic-dump'.
* src/sysdep.c (init_system_name): Use a constant
if a deterministic dump is requested.
---
 configure.ac    | 13 +++++++++++++
 lisp/version.el |  7 ++++---
 src/emacs.c     | 10 ++++++++++
 src/sysdep.c    |  7 +++++++
 4 files changed, 34 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index 0b7b403..abbe7f8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -542,6 +542,19 @@ AC_ARG_ENABLE(gtk-deprecation-warnings,
 		[Show Gtk+/Gdk deprecation warnings for Gtk+ >= 3.0])],
 [ac_enable_gtk_deprecation_warnings="${enableval}"],[])
 
+AC_ARG_ENABLE(deterministic-dump,
+[AS_HELP_STRING([--enable-deterministic-dump],
+                [Make dumping deterministic by removing system-specific
+                information from the dump, such as host names and
+                timestamps.])])
+if test "x${enableval}" = xno ; then
+   AC_DEFINE(DETERMINISTIC_DUMP, false,
+   [Set this to true to make dumping deterministic.])
+else
+   AC_DEFINE(DETERMINISTIC_DUMP, true,
+   [Set this to true to make dumping deterministic.])
+fi
+
 dnl This used to use changequote, but, apart from 'changequote is evil'
 dnl per the autoconf manual, we can speed up autoconf somewhat by quoting
 dnl the great gob of text.  Thus it's not processed for possible expansion.
diff --git a/lisp/version.el b/lisp/version.el
index 43103fd..a3f0ea0 100644
--- a/lisp/version.el
+++ b/lisp/version.el
@@ -38,12 +38,13 @@ emacs-minor-version
   "Minor version number of this version of Emacs.
 This variable first existed in version 19.23.")
 
+;; FIXME: The next variable should also be a constant if
+;; `deterministic-dump' is t.
 (defconst emacs-build-time (current-time)
   "Time at which Emacs was dumped out.")
 
-;; I think this should be obsoleted/removed.  It's just one more meaningless
-;; difference between different builds.  It's usually not even an fqdn.
-(defconst emacs-build-system (system-name)
+(defconst emacs-build-system
+  (if deterministic-dump "elided" (system-name))
   "Name of the system on which Emacs was built.")
 
 (defvar motif-version-string)
diff --git a/src/emacs.c b/src/emacs.c
index 2e9f950..863473a 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -925,6 +925,9 @@ main (int argc, char **argv)
   SET_BINARY (fileno (stdout));
 #endif /* MSDOS */
 
+  if (DETERMINISTIC_DUMP)
+    Vdeterministic_dump = Qt;
+
   /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
      The build procedure uses this while dumping, to ensure that the
      dumped Emacs does not have its system locale tables initialized,
@@ -2566,6 +2569,13 @@ libraries; only those already known by Emacs will be loaded.  */);
   Vdynamic_library_alist = Qnil;
   Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
 
+  DEFVAR_BOOL ("deterministic-dump", Vdeterministic_dump,
+    doc: /* If non-nil, attempt to make dumping deterministic by
+avoiding sources of nondeterminism such as absolute file names, the
+hostname, or timestamps.  */);
+  Vdeterministic_dump = DETERMINISTIC_DUMP ? Qt : Qnil;
+  XSYMBOL (intern_c_string ("deterministic-dump"))->constant = 1;
+
 #ifdef WINDOWSNT
   Vlibrary_cache = Qnil;
   staticpro (&Vlibrary_cache);
diff --git a/src/sysdep.c b/src/sysdep.c
index 1af323e..5bbf723 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1399,6 +1399,13 @@ setup_pty (int fd)
 void
 init_system_name (void)
 {
+  if (DETERMINISTIC_DUMP && (might_dump || ! NILP (Vpurify_flag)))
+    {
+      /* If we're dumping, set the hostname to a literal so that the
+         dump is deterministic.  */
+      Vsystem_name = build_pure_c_string ("elided");
+      return;
+    }
   char *hostname_alloc = NULL;
   char *hostname;
 #ifndef HAVE_GETHOSTNAME
-- 
2.5.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #3: 0002-Deterministic-build-improvements.patch --]
[-- Type: text/x-diff; name="0002-Deterministic-build-improvements.patch", Size: 11151 bytes --]

From 63ece9364a72fc981778a93eb4359db1d33fdd74 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sun, 27 Dec 2015 14:50:27 -0800
Subject: [PATCH 2/2] Deterministic build improvements

* configure.ac (DETERMINISTIC_BUILD): Rename from DETERMINISTIC_DUMP.
All uses changed.  Change option to --enable-deterministic-build.
* doc/lispref/internals.texi (Building Emacs):
* etc/NEWS:
Document --enable-deterministic-build.
* doc/lispref/intro.texi (Version Info): Remove documentation
for emacs-build-time.  It is no longer correct, and this variable
should not be documented in the intro, any more than
emacs-build-system should be documented.
* lisp/erc/erc-compat.el (erc-emacs-build-time):
Now nil with deterministic builds.
* lisp/erc/erc.el (erc-cmd-SV):
* lisp/version.el (emacs-version):
Do not output build time if deterministic build.
* lisp/version.el (emacs-build-time, emacs-build-system):
Now nil if deterministic build.
* src/emacs.c: Rename var from deterministic-dump to
deterministic-build.  All uses changed.
(main): Remove unnecessary initialization
of Vdeterministic_build.
(syms_of_emacs): Set Vdeterministic_build to a boolean, not
to a Lisp_Object.  No need to set it if it is false, since
false is the default.
* src/sysdep.c (init_system_name): When dumping and
deterministic build, set system-name to nil, not to "elided".
---
 configure.ac               | 13 ++++++-------
 doc/lispref/internals.texi |  8 ++++++++
 doc/lispref/intro.texi     | 13 -------------
 etc/NEWS                   |  8 ++++++++
 lisp/erc/erc-compat.el     |  5 ++---
 lisp/erc/erc.el            |  6 ++++--
 lisp/version.el            | 23 +++++++++++++----------
 src/emacs.c                | 15 ++++++---------
 src/sysdep.c               |  7 +++----
 9 files changed, 50 insertions(+), 48 deletions(-)

diff --git a/configure.ac b/configure.ac
index abbe7f8..9dce607 100644
--- a/configure.ac
+++ b/configure.ac
@@ -542,16 +542,15 @@ AC_ARG_ENABLE(gtk-deprecation-warnings,
 		[Show Gtk+/Gdk deprecation warnings for Gtk+ >= 3.0])],
 [ac_enable_gtk_deprecation_warnings="${enableval}"],[])
 
-AC_ARG_ENABLE(deterministic-dump,
-[AS_HELP_STRING([--enable-deterministic-dump],
-                [Make dumping deterministic by removing system-specific
-                information from the dump, such as host names and
-                timestamps.])])
+AC_ARG_ENABLE(deterministic-build,
+[AS_HELP_STRING([--enable-deterministic-build],
+		[Make the build deterministic by omitting host names,
+		 time stamps, etc. from the output.])])
 if test "x${enableval}" = xno ; then
-   AC_DEFINE(DETERMINISTIC_DUMP, false,
+   AC_DEFINE(DETERMINISTIC_BUILD, false,
    [Set this to true to make dumping deterministic.])
 else
-   AC_DEFINE(DETERMINISTIC_DUMP, true,
+   AC_DEFINE(DETERMINISTIC_BUILD, true,
    [Set this to true to make dumping deterministic.])
 fi
 
diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index e620da0..1b7dcfa 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -64,6 +64,14 @@ Building Emacs
 and are not able to implement dumping, then Emacs must load
 @file{loadup.el} each time it starts.
 
+@cindex deterministic build
+@cindex @option{--enable-deterministic-build} option to @command{configure}
+  By default the dumped @file{emacs} executable contains details such
+as the build time and host name.  Use the
+@option{--enable-determistic-build} option of @command{configure} to
+suppress these details, so that building and installing Emacs twice
+from the same sources should result in identical copies of Emacs.
+
 @cindex @file{site-load.el}
   You can specify additional files to preload by writing a library named
 @file{site-load.el} that loads them.  You may need to rebuild Emacs
diff --git a/doc/lispref/intro.texi b/doc/lispref/intro.texi
index 865c698..24a7131 100644
--- a/doc/lispref/intro.texi
+++ b/doc/lispref/intro.texi
@@ -491,19 +491,6 @@ Version Info
 giving a prefix argument makes @var{here} non-@code{nil}.
 @end deffn
 
-@defvar emacs-build-time
-The value of this variable indicates the time at which Emacs was
-built.  It is a list of four integers, like the value of
-@code{current-time} (@pxref{Time of Day}).
-
-@example
-@group
-emacs-build-time
-     @result{} (20614 63694 515336 438000)
-@end group
-@end example
-@end defvar
-
 @defvar emacs-version
 The value of this variable is the version of Emacs being run.  It is a
 string such as @code{"23.1.1"}.  The last number in this string is not
diff --git a/etc/NEWS b/etc/NEWS
index 20a1232..e0ddc79 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -25,6 +25,14 @@ otherwise leave it unmarked.
 \f
 * Installation Changes in Emacs 25.2
 
+** New configure option ‘--enable-deterministic-build’ attempts to
+build an Emacs that is reproducible; that is, if you build and
+install Emacs twice, the second installation is a copy of the first.
+Deterministic builds omit the build date from the output of the
+emacs-version and erc-cmd-SV functions, and the leave the following
+variables nil: emacs-build-system, emacs-build-time,
+erc-emacs-build-time.
+
 ** 'configure' detects the kqueue file notification library on *BSD
 and Mac OS X machines.
 
diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el
index d8af692..7c7edd1 100644
--- a/lisp/erc/erc-compat.el
+++ b/lisp/erc/erc-compat.el
@@ -54,10 +54,10 @@ erc-set-write-file-functions
   (set (make-local-variable 'write-file-functions) new-val))
 
 (defvar erc-emacs-build-time
-  (if (stringp emacs-build-time)
+  (if (or (stringp emacs-build-time) (not emacs-build-time))
       emacs-build-time
     (format-time-string "%Y-%m-%d" emacs-build-time))
-  "Time at which Emacs was dumped out.")
+  "Time at which Emacs was dumped out, or nil if not available.")
 
 ;; Emacs 21 and XEmacs do not have user-emacs-directory, but XEmacs
 ;; has user-init-directory.
@@ -164,4 +164,3 @@ erc-subseq
 ;; indent-tabs-mode: t
 ;; tab-width: 8
 ;; End:
-
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index cd8e427..3ff919a 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -3574,7 +3574,7 @@ gtk-version-string
 
 (defun erc-cmd-SV ()
   "Say the current ERC and Emacs version into channel."
-  (erc-send-message (format "I'm using ERC with %s %s (%s%s) of %s."
+  (erc-send-message (format "I'm using ERC with %s %s (%s%s)%s."
                             (if (featurep 'xemacs) "XEmacs" "GNU Emacs")
                             emacs-version
                             system-configuration
@@ -3595,7 +3595,9 @@ erc-cmd-SV
                                                       x-toolkit-scroll-bars)))
                                "")
                              (if (featurep 'multi-tty) ", multi-tty" ""))
-                            erc-emacs-build-time))
+                            (if erc-emacs-build-time
+                                (concat " of " erc-emacs-build-time)
+                              "")))
   t)
 
 (defun erc-cmd-SM ()
diff --git a/lisp/version.el b/lisp/version.el
index a3f0ea0..a6686e1 100644
--- a/lisp/version.el
+++ b/lisp/version.el
@@ -38,14 +38,12 @@ emacs-minor-version
   "Minor version number of this version of Emacs.
 This variable first existed in version 19.23.")
 
-;; FIXME: The next variable should also be a constant if
-;; `deterministic-dump' is t.
-(defconst emacs-build-time (current-time)
-  "Time at which Emacs was dumped out.")
+(defconst emacs-build-time (if (not deterministic-build) (current-time))
+  "Time at which Emacs was dumped out, or nil if not available.")
 
 (defconst emacs-build-system
-  (if deterministic-dump "elided" (system-name))
-  "Name of the system on which Emacs was built.")
+  (if (not deterministic-build) (system-name))
+  "Name of the system on which Emacs was built, or nil if not available.")
 
 (defvar motif-version-string)
 (defvar gtk-version-string)
@@ -59,9 +57,7 @@ emacs-version
 to the system configuration; look at `system-configuration' instead."
   (interactive "P")
   (let ((version-string
-         (format (if (not (called-interactively-p 'interactive))
-		     "GNU Emacs %s (%s%s%s%s)\n of %s"
-		   "GNU Emacs %s (%s%s%s%s) of %s")
+         (format "GNU Emacs %s (%s%s%s%s)%s"
                  emacs-version
 		 system-configuration
 		 (cond ((featurep 'motif)
@@ -80,7 +76,14 @@ emacs-version
 		     (format ", %s scroll bars"
 			     (capitalize (symbol-name x-toolkit-scroll-bars)))
 		   "")
-		 (format-time-string "%Y-%m-%d" emacs-build-time))))
+		 (if emacs-build-time
+		     (format-time-string (concat
+					  (if (called-interactively-p
+					       'interactive)
+					      "" "\n")
+					  " of %Y-%m-%d")
+					 emacs-build-time)
+		   ""))))
     (if here
         (insert version-string)
       (if (called-interactively-p 'interactive)
diff --git a/src/emacs.c b/src/emacs.c
index 863473a..e7c153f 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -925,9 +925,6 @@ main (int argc, char **argv)
   SET_BINARY (fileno (stdout));
 #endif /* MSDOS */
 
-  if (DETERMINISTIC_DUMP)
-    Vdeterministic_dump = Qt;
-
   /* Skip initial setlocale if LC_ALL is "C", as it's not needed in that case.
      The build procedure uses this while dumping, to ensure that the
      dumped Emacs does not have its system locale tables initialized,
@@ -2569,12 +2566,12 @@ libraries; only those already known by Emacs will be loaded.  */);
   Vdynamic_library_alist = Qnil;
   Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
 
-  DEFVAR_BOOL ("deterministic-dump", Vdeterministic_dump,
-    doc: /* If non-nil, attempt to make dumping deterministic by
-avoiding sources of nondeterminism such as absolute file names, the
-hostname, or timestamps.  */);
-  Vdeterministic_dump = DETERMINISTIC_DUMP ? Qt : Qnil;
-  XSYMBOL (intern_c_string ("deterministic-dump"))->constant = 1;
+  DEFVAR_BOOL ("deterministic-build", Vdeterministic_build,
+    doc: /* If non-nil, make builds deterministic by omitting
+host names, time stamps, etc. from the output.  */);
+  if (DETERMINISTIC_BUILD)
+    Vdeterministic_build = true;
+  XSYMBOL (intern_c_string ("deterministic-build"))->constant = 1;
 
 #ifdef WINDOWSNT
   Vlibrary_cache = Qnil;
diff --git a/src/sysdep.c b/src/sysdep.c
index 5bbf723..8147afe 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1399,11 +1399,10 @@ setup_pty (int fd)
 void
 init_system_name (void)
 {
-  if (DETERMINISTIC_DUMP && (might_dump || ! NILP (Vpurify_flag)))
+  if (DETERMINISTIC_BUILD && (might_dump || ! NILP (Vpurify_flag)))
     {
-      /* If we're dumping, set the hostname to a literal so that the
-         dump is deterministic.  */
-      Vsystem_name = build_pure_c_string ("elided");
+      /* Set system-name to nil so that the build is deterministic.  */
+      Vsystem_name = Qnil;
       return;
     }
   char *hostname_alloc = NULL;
-- 
2.5.0


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: combined.patch --]
[-- Type: text/x-diff; name="combined.patch", Size: 8303 bytes --]

diff --git a/configure.ac b/configure.ac
index 0b7b403..9dce607 100644
--- a/configure.ac
+++ b/configure.ac
@@ -542,6 +542,18 @@ AC_ARG_ENABLE(gtk-deprecation-warnings,
 		[Show Gtk+/Gdk deprecation warnings for Gtk+ >= 3.0])],
 [ac_enable_gtk_deprecation_warnings="${enableval}"],[])
 
+AC_ARG_ENABLE(deterministic-build,
+[AS_HELP_STRING([--enable-deterministic-build],
+		[Make the build deterministic by omitting host names,
+		 time stamps, etc. from the output.])])
+if test "x${enableval}" = xno ; then
+   AC_DEFINE(DETERMINISTIC_BUILD, false,
+   [Set this to true to make dumping deterministic.])
+else
+   AC_DEFINE(DETERMINISTIC_BUILD, true,
+   [Set this to true to make dumping deterministic.])
+fi
+
 dnl This used to use changequote, but, apart from 'changequote is evil'
 dnl per the autoconf manual, we can speed up autoconf somewhat by quoting
 dnl the great gob of text.  Thus it's not processed for possible expansion.
diff --git a/doc/lispref/internals.texi b/doc/lispref/internals.texi
index e620da0..1b7dcfa 100644
--- a/doc/lispref/internals.texi
+++ b/doc/lispref/internals.texi
@@ -64,6 +64,14 @@ Building Emacs
 and are not able to implement dumping, then Emacs must load
 @file{loadup.el} each time it starts.
 
+@cindex deterministic build
+@cindex @option{--enable-deterministic-build} option to @command{configure}
+  By default the dumped @file{emacs} executable contains details such
+as the build time and host name.  Use the
+@option{--enable-determistic-build} option of @command{configure} to
+suppress these details, so that building and installing Emacs twice
+from the same sources should result in identical copies of Emacs.
+
 @cindex @file{site-load.el}
   You can specify additional files to preload by writing a library named
 @file{site-load.el} that loads them.  You may need to rebuild Emacs
diff --git a/doc/lispref/intro.texi b/doc/lispref/intro.texi
index 865c698..24a7131 100644
--- a/doc/lispref/intro.texi
+++ b/doc/lispref/intro.texi
@@ -491,19 +491,6 @@ Version Info
 giving a prefix argument makes @var{here} non-@code{nil}.
 @end deffn
 
-@defvar emacs-build-time
-The value of this variable indicates the time at which Emacs was
-built.  It is a list of four integers, like the value of
-@code{current-time} (@pxref{Time of Day}).
-
-@example
-@group
-emacs-build-time
-     @result{} (20614 63694 515336 438000)
-@end group
-@end example
-@end defvar
-
 @defvar emacs-version
 The value of this variable is the version of Emacs being run.  It is a
 string such as @code{"23.1.1"}.  The last number in this string is not
diff --git a/etc/NEWS b/etc/NEWS
index 20a1232..e0ddc79 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -25,6 +25,14 @@ otherwise leave it unmarked.
 \f
 * Installation Changes in Emacs 25.2
 
+** New configure option ‘--enable-deterministic-build’ attempts to
+build an Emacs that is reproducible; that is, if you build and
+install Emacs twice, the second installation is a copy of the first.
+Deterministic builds omit the build date from the output of the
+emacs-version and erc-cmd-SV functions, and the leave the following
+variables nil: emacs-build-system, emacs-build-time,
+erc-emacs-build-time.
+
 ** 'configure' detects the kqueue file notification library on *BSD
 and Mac OS X machines.
 
diff --git a/lisp/erc/erc-compat.el b/lisp/erc/erc-compat.el
index d8af692..7c7edd1 100644
--- a/lisp/erc/erc-compat.el
+++ b/lisp/erc/erc-compat.el
@@ -54,10 +54,10 @@ erc-set-write-file-functions
   (set (make-local-variable 'write-file-functions) new-val))
 
 (defvar erc-emacs-build-time
-  (if (stringp emacs-build-time)
+  (if (or (stringp emacs-build-time) (not emacs-build-time))
       emacs-build-time
     (format-time-string "%Y-%m-%d" emacs-build-time))
-  "Time at which Emacs was dumped out.")
+  "Time at which Emacs was dumped out, or nil if not available.")
 
 ;; Emacs 21 and XEmacs do not have user-emacs-directory, but XEmacs
 ;; has user-init-directory.
@@ -164,4 +164,3 @@ erc-subseq
 ;; indent-tabs-mode: t
 ;; tab-width: 8
 ;; End:
-
diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el
index cd8e427..3ff919a 100644
--- a/lisp/erc/erc.el
+++ b/lisp/erc/erc.el
@@ -3574,7 +3574,7 @@ gtk-version-string
 
 (defun erc-cmd-SV ()
   "Say the current ERC and Emacs version into channel."
-  (erc-send-message (format "I'm using ERC with %s %s (%s%s) of %s."
+  (erc-send-message (format "I'm using ERC with %s %s (%s%s)%s."
                             (if (featurep 'xemacs) "XEmacs" "GNU Emacs")
                             emacs-version
                             system-configuration
@@ -3595,7 +3595,9 @@ erc-cmd-SV
                                                       x-toolkit-scroll-bars)))
                                "")
                              (if (featurep 'multi-tty) ", multi-tty" ""))
-                            erc-emacs-build-time))
+                            (if erc-emacs-build-time
+                                (concat " of " erc-emacs-build-time)
+                              "")))
   t)
 
 (defun erc-cmd-SM ()
diff --git a/lisp/version.el b/lisp/version.el
index 43103fd..a6686e1 100644
--- a/lisp/version.el
+++ b/lisp/version.el
@@ -38,13 +38,12 @@ emacs-minor-version
   "Minor version number of this version of Emacs.
 This variable first existed in version 19.23.")
 
-(defconst emacs-build-time (current-time)
-  "Time at which Emacs was dumped out.")
+(defconst emacs-build-time (if (not deterministic-build) (current-time))
+  "Time at which Emacs was dumped out, or nil if not available.")
 
-;; I think this should be obsoleted/removed.  It's just one more meaningless
-;; difference between different builds.  It's usually not even an fqdn.
-(defconst emacs-build-system (system-name)
-  "Name of the system on which Emacs was built.")
+(defconst emacs-build-system
+  (if (not deterministic-build) (system-name))
+  "Name of the system on which Emacs was built, or nil if not available.")
 
 (defvar motif-version-string)
 (defvar gtk-version-string)
@@ -58,9 +57,7 @@ emacs-version
 to the system configuration; look at `system-configuration' instead."
   (interactive "P")
   (let ((version-string
-         (format (if (not (called-interactively-p 'interactive))
-		     "GNU Emacs %s (%s%s%s%s)\n of %s"
-		   "GNU Emacs %s (%s%s%s%s) of %s")
+         (format "GNU Emacs %s (%s%s%s%s)%s"
                  emacs-version
 		 system-configuration
 		 (cond ((featurep 'motif)
@@ -79,7 +76,14 @@ emacs-version
 		     (format ", %s scroll bars"
 			     (capitalize (symbol-name x-toolkit-scroll-bars)))
 		   "")
-		 (format-time-string "%Y-%m-%d" emacs-build-time))))
+		 (if emacs-build-time
+		     (format-time-string (concat
+					  (if (called-interactively-p
+					       'interactive)
+					      "" "\n")
+					  " of %Y-%m-%d")
+					 emacs-build-time)
+		   ""))))
     (if here
         (insert version-string)
       (if (called-interactively-p 'interactive)
diff --git a/src/emacs.c b/src/emacs.c
index 2e9f950..e7c153f 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -2566,6 +2566,13 @@ libraries; only those already known by Emacs will be loaded.  */);
   Vdynamic_library_alist = Qnil;
   Fput (intern_c_string ("dynamic-library-alist"), Qrisky_local_variable, Qt);
 
+  DEFVAR_BOOL ("deterministic-build", Vdeterministic_build,
+    doc: /* If non-nil, make builds deterministic by omitting
+host names, time stamps, etc. from the output.  */);
+  if (DETERMINISTIC_BUILD)
+    Vdeterministic_build = true;
+  XSYMBOL (intern_c_string ("deterministic-build"))->constant = 1;
+
 #ifdef WINDOWSNT
   Vlibrary_cache = Qnil;
   staticpro (&Vlibrary_cache);
diff --git a/src/sysdep.c b/src/sysdep.c
index 1af323e..8147afe 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -1399,6 +1399,12 @@ setup_pty (int fd)
 void
 init_system_name (void)
 {
+  if (DETERMINISTIC_BUILD && (might_dump || ! NILP (Vpurify_flag)))
+    {
+      /* Set system-name to nil so that the build is deterministic.  */
+      Vsystem_name = Qnil;
+      return;
+    }
   char *hostname_alloc = NULL;
   char *hostname;
 #ifndef HAVE_GETHOSTNAME

  parent reply	other threads:[~2015-12-27 23:26 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-16 17:03 [PATCH] Honor 'SOURCE_DATE_EPOCH' when generating autoloads Ludovic Courtès
2015-11-29 10:44 ` [PATCH PING] " Ludovic Courtès
2015-11-29 16:02   ` Eli Zaretskii
2015-11-29 16:57     ` Ludovic Courtès
2015-11-29 18:12       ` Eli Zaretskii
2015-11-29 20:38         ` Ludovic Courtès
2015-11-30 17:00         ` John Wiegley
2015-11-30 19:30           ` Ludovic Courtès
2015-12-07 18:36             ` Philipp Stephani
2015-12-07 18:58               ` Paul Eggert
2015-12-07 19:00                 ` Philipp Stephani
2015-12-07 19:14                   ` Paul Eggert
2015-12-20 12:48                     ` Philipp Stephani
2015-12-20 16:37                       ` Eli Zaretskii
2015-12-20 18:39                         ` Philipp Stephani
2015-12-20 19:03                           ` Eli Zaretskii
2015-12-20 21:27                           ` Paul Eggert
2015-12-23  1:13                             ` John Wiegley
2015-12-23 16:01                               ` Philipp Stephani
2015-12-23 16:39                                 ` Eli Zaretskii
2015-12-23 16:52                                   ` Philipp Stephani
2015-12-23 17:10                                     ` Eli Zaretskii
2015-12-23 17:38                                       ` Philipp Stephani
2015-12-23 21:09                                         ` Paul Eggert
2015-12-24  3:33                                           ` Eli Zaretskii
2015-12-24  6:54                                             ` Paul Eggert
2015-12-24 16:18                                               ` Eli Zaretskii
2015-12-27  9:53                                     ` Philipp Stephani
2015-12-27 16:10                                       ` Eli Zaretskii
2016-02-29 21:52                                         ` Philipp Stephani
2016-03-01 16:36                                           ` Paul Eggert
2016-03-01 21:46                                             ` Philipp Stephani
2016-03-02 18:24                                               ` Paul Eggert
2016-03-02 18:30                                                 ` Philipp Stephani
2016-03-22 13:30                                                   ` Philipp Stephani
2016-03-22 20:37                                                     ` Paul Eggert
2016-03-22 21:46                                                       ` Philipp Stephani
2016-03-22 21:58                                                         ` Paul Eggert
2016-03-23  8:03                                                         ` Andreas Schwab
2016-04-06 21:29                                                           ` Philipp Stephani
2015-12-27 23:26                                       ` Paul Eggert [this message]
2015-12-28 16:26                                         ` Eli Zaretskii
2015-12-28 18:00                                           ` Paul Eggert
2015-12-28 18:23                                             ` Eli Zaretskii
2015-12-29  3:01                                               ` Paul Eggert
2015-12-29 15:38                                                 ` Eli Zaretskii
2015-12-29 16:47                                                   ` Paul Eggert
2015-12-29 17:59                                                     ` Eli Zaretskii
2015-12-29 20:33                                                       ` Paul Eggert
2015-12-07 23:11               ` Ludovic Courtès
2015-11-30  9:22       ` Alex Kost
2015-11-29 20:22   ` Paul Eggert
2015-11-29 20:42     ` Ludovic Courtès

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=568073A4.3010604@cs.ucla.edu \
    --to=eggert@cs.ucla.edu \
    --cc=eliz@gnu.org \
    --cc=emacs-devel@gnu.org \
    --cc=p.stephani2@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).