]> git.eshelyaron.com Git - emacs.git/commitdiff
Export major version of latest Emacs supported by emacs-module.h.
authorPhilipp Stephani <phst@google.com>
Wed, 24 Apr 2019 08:22:18 +0000 (10:22 +0200)
committerPhilipp Stephani <phst@google.com>
Sun, 28 Apr 2019 18:08:25 +0000 (20:08 +0200)
This is useful if module authors want to support multiple versions of
emacs-module.h.

* configure.ac (emacs_major_version): Define substitution.

* src/emacs-module.h.in (EMACS_MAJOR_VERSION): Define macro.

* doc/lispref/internals.texi (Module Initialization): Document
EMACS_MAJOR_VERSION preprocessor macro.

* test/data/emacs-module/mod-test.c (emacs_module_init): Verify
behavior of EMACS_MAJOR_VERSION.

configure.ac
doc/lispref/internals.texi
etc/NEWS
src/emacs-module.h.in
test/data/emacs-module/mod-test.c

index 810c3219e4f4623d6dc5399fbfe4c61947ea34ef..79fe0c98c6f586b0ac515a52efe22f8f5e848ce9 100644 (file)
@@ -3697,6 +3697,8 @@ AC_SUBST_FILE([module_env_snippet_27])
 module_env_snippet_25="$srcdir/src/module-env-25.h"
 module_env_snippet_26="$srcdir/src/module-env-26.h"
 module_env_snippet_27="$srcdir/src/module-env-27.h"
+emacs_major_version="${PACKAGE_VERSION%%.*}"
+AC_SUBST(emacs_major_version)
 
 ### Use -lpng if available, unless '--with-png=no'.
 HAVE_PNG=no
index 5ae71afbef25b33d903a3eaf6f96b3e6b72d6452..cfeb492af40427acd144d6a062e7bb0afb15e26d 100644 (file)
@@ -1191,6 +1191,17 @@ grow with new Emacs releases.  Given the version of Emacs, the module
 can use only the parts of the module @acronym{API} that existed in
 that version, since those parts are identical in later versions.
 
+@file{emacs-module.h} defines a preprocessor macro
+@code{EMACS_MAJOR_VERSION}.  It expands to an integer literal which is
+the latest major version of Emacs supported by the header.
+@xref{Version Info}.  Note that the value of
+@code{EMACS_MAJOR_VERSION} is a compile-time constant and does not
+represent the version of Emacs that is currently running and has
+loaded your module.  If you want your module to be compatible with
+various versions of @file{emacs-module.h} as well as various versions
+of Emacs, you can use conditional compilation based on
+@code{EMACS_MAJOR_VERSION}.
+
 We recommend that modules always perform the compatibility
 verification, unless they do their job entirely in the initialization
 function, and don't access any Lisp objects or use any Emacs functions
index cf6f4fea3e900d5f0ff28c8901eda3a169e92f0d..9b32d720b62b46a60505de1a3a01a900570fbcf8 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1933,6 +1933,9 @@ convert between timespec structures and Emacs Lisp time values.
 'extract_big_integer' to create and extract arbitrary-size integer
 values.
 
+** emacs-module.h now defines a macro EMACS_MAJOR_VERSION that expands
+to the major version of the latest Emacs supported by the header.
+
 \f
 * Changes in Emacs 27.1 on Non-Free Operating Systems
 
index fbc62a61ef4e62924b3e00ec1c1ec10812d84084..9955e30eb7a5680f06ac7c8e3bff4b7e3f1b55d5 100644 (file)
@@ -32,6 +32,8 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <gmp.h>
 #endif
 
+#define EMACS_MAJOR_VERSION @emacs_major_version@
+
 #if defined __cplusplus && __cplusplus >= 201103L
 # define EMACS_NOEXCEPT noexcept
 #else
index b7007bd80ffea7468569cdd5bd004352628f1f22..a9154fa167db3e27b722573e1558ec465894cc30 100644 (file)
@@ -445,6 +445,11 @@ bind_function (emacs_env *env, const char *name, emacs_value Sfun)
 int
 emacs_module_init (struct emacs_runtime *ert)
 {
+  /* Check that EMACS_MAJOR_VERSION is defined and an integral
+     constant.  */
+  char dummy[EMACS_MAJOR_VERSION];
+  assert (27 <= sizeof dummy);
+
   if (ert->size < sizeof *ert)
     {
       fprintf (stderr, "Runtime size of runtime structure (%"pT" bytes) "