Next: Incompatibilities Up: Compatibility
16.1 Extensions in GNU M4
This version of `m4' contains a few facilities that do not exist in
System V `m4'. These extra facilities are all suppressed by using the
`-G' command line option (Note: Invoking m4.), unless
overridden by other command line options.
* In the `$N' notation for macro arguments, N can contain several
digits, while the System V `m4' only accepts one digit. This
allows macros in GNU `m4' to take any number of arguments, and not
only nine (Note: Arguments).
This means that `define(`foo', `$11')' is ambiguous between
implementations. To portably choose between grabbing the first
parameter and appending 1 to the expansion, or grabbing the
eleventh parameter, you can do the following:
dnl First argument, concatenated with 1
define(`_1', `$1')define(`first1', `_1($@)1')
dnl Eleventh argument, portable
define(`_9', `$9')define(`eleventh', `_9(shift(shift($@)))')
dnl Eleventh argument, GNU style
first1(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
eleventh(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
Eleventh(`a', `b', `c', `d', `e', `f', `g', `h', `i', `j', `k')
Also see the `argn' macro (Note: Shift).
* The `divert' (Note: Divert) macro can manage more than 9
diversions. GNU `m4' treats all positive numbers as valid
diversions, rather than discarding diversions greater than 9.
* Files included with `include' and `sinclude' are sought in a user
specified search path, if they are not found in the working
directory. The search path is specified by the `-I' option and the
`M4PATH' environment variable (Note: Search Path).
* Arguments to `undivert' can be non-numeric, in which case the named
file will be included uninterpreted in the output (*note
* Formatted output is supported through the `format' builtin, which
is modeled after the C library function `printf' (Note: Format).
* Searches and text substitution through basic regular expressions
are supported by the `regexp' (Note: Regexp) and `patsubst'
(Note: Patsubst) builtins. Some BSD implementations use
extended regular expressions instead.
* The output of shell commands can be read into `m4' with `esyscmd'
* There is indirect access to any builtin macro with `builtin'
* Macros can be called indirectly through `indir' (Note: Indir).
* The name of the program, the current input file, and the current
input line number are accessible through the builtins
`__program__', `__file__', and `__line__' (Note: Location).
* The format of the output from `dumpdef' and macro tracing can be
controlled with `debugmode' (Note: Debug Levels).
* The destination of trace and debug output can be controlled with
`debugfile' (Note: Debug Output).
* The `maketemp' (Note: Mkstemp) macro behaves like `mkstemp',
creating a new file with a unique name on every invocation, rather
than following the insecure behavior of replacing the trailing `X'
characters with the `m4' process id.
* POSIX only requires support for the command line options `-s',
`-D', and `-U', so all other options accepted by GNU M4 are
extensions. Note: Invoking m4, for a description of these
The debugging and tracing facilities in GNU `m4' are much more
extensive than in most other versions of `m4'.
automatically generated by info2www