| This directory contains all bundled modules for GNU m4. |
| |
| Dynamic modules are only available if the host operating system provides |
| one (or more!) of libltdl's required APIs. |
| |
| Implementation details are in ../m4/module.c |
| |
| A module is a compiled shared object, i.e., modules are written in C and |
| then compiled. The compiled file can then be loaded into a running m4 |
| process by calling m4 with the module name listed on the command line, |
| or by calling the builtin "include". This gives GNU m4 potential access |
| to any system feature with a C interface. |
| |
| Modules are searched for in M4PATH, if set, else in a module directory |
| defined at configure time, $prefix/lib/m4/ by default. Extra directories |
| can also be added to the search patch by specifying them on the command |
| line with the `-I' or `-B' options. |
| |
| A module extends GNU m4 by defining new builtins, It can define builtins |
| with the same names as existing builtins, which will shadow the existing |
| builtins, making them temporarily unavailable. A module cannot redefine |
| internal functions of GNU m4, such as the input parser or argument handling |
| (yet!). |
| |
| Each module should include the installed header file, |
| `$prefix/include/m4module.h'. This will define all the necessary macros, |
| type declarations and function prototypes required to implement a module. |
| |
| The module system uses libtool's libltdl for dynamic module loading, and |
| that in turn requires that any non-static symbols in the module to be |
| be in their own namespace to avoid namespace clashes with symbols |
| exported from other modules (which may be loaded too!). This is usually |
| done by `#define'ing these symbols to libltdl's naming scheme at the top |
| of the file. The scheme is to prefix each symbol with the module name, |
| followed by `_LTX_' and then the original symbol name. For example, |
| to export "m4_macro_table" in a source file which will become part of |
| a module, "mymod", we would add the following to the top of the source file: |
| `#define m4_macro_table mymod_LTX_m4_macro_table'. See the included modules |
| for more examples. |
| |
| Each module *must* define one or more entry points from the following: |
| "m4_builtin_table", "m4_macro_table" and "m4_init_module". The symbol |
| "m4_builtin_table" is a pointer to a table of "m4_builtin" (defined in |
| m4module.h), listing each new builtin that it implements. The symbol |
| "m4_macro_table", is a pointer to a table of "m4_macro", listing each |
| text macro initialised by the module. These tables end with an |
| entry where name == NULL. |
| |
| If a module defines the symbol "m4_init_module", it is supposed to be a |
| function with a prototype of "void m4_init_module (struct obstack *obs)", |
| and it will be called as soon as the module is loaded. Any non-finished |
| object left on the obstack will be the expansion of the call of the |
| builtin "include". The obstack pointer might be NULL (in the future). |
| |
| If a module defines the symbol "m4_finish_module", it is supposed to be |
| a function with a prototype of "void m4_finish_module (void)", and it |
| will be called just before the module is unloaded or GNU m4 exits. This |
| will allow a module to clean up before exit. There is no way of |
| communicating information to the user, as GNU m4 exits immediately |
| afterwards. |
| |
| No other symbols will be used by GNU m4. All other symbols within the |
| module are private and should be declared `static' so that they will not |
| be accessible to GNU m4 or to other modules. |
| |
| Modules are allowed to call external functions already defined within |
| the GNU m4module library. These have prototypes in m4module.h. |
| |
| Loading and unloading of modules, and symbol namespace resolution |
| strategies are illustrated by shadow.c and shadow.m4. |
| |
| To try the demos, compile with `make' and run them with the commands as: |
| |
| tests/m4 doc/examples/time.m4 |
| |
| or in the case of time2.m4 |
| |
| tests/m4 -I tests time -I doc/examples time2.m4 |
| |
| ======================================================================== |
| |
| Copyright (C) 2000-2001, 2006, 2010, 2013-2014, 2017 Free Software |
| Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with no |
| Invariant Sections, with no Front-Cover Texts, and with no Back-Cover |
| Texts. A copy of the license is included in the ``GNU Free |
| Documentation License'' file as part of this distribution. |