Export major version of latest Emacs supported by emacs-module.h.
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.
This commit is contained in:
parent
24f717a5d7
commit
4d97e1a9ea
5 changed files with 23 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
3
etc/NEWS
3
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.
|
||||
|
||||
|
||||
* Changes in Emacs 27.1 on Non-Free Operating Systems
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) "
|
||||
|
|
Loading…
Add table
Reference in a new issue