M4(1) | General Commands Manual | M4(1) |
m4
— macro
language processor
m4 |
[-EGgPs ]
[-D name[=value]]
[-d [[+-]flags]]
[-I dirname]
[-o filename]
[-t macro]
[-U name]
[file ...] |
The m4
utility is a macro processor that
can be used as a front end to any language (e.g., C, ratfor, fortran, lex,
and yacc). If no input files are given, m4
reads
from the standard input, otherwise files specified on the command line are
processed in the given order. Input files can be regular files, files in the
m4 include paths, or a single dash (‘-’), denoting standard
input. m4
writes the processed text to the standard
output, unless told otherwise.
Macro calls have the form name(argument1[, argument2, ..., argumentN]).
There cannot be any space following the macro name and the open parenthesis (‘(’). If the macro name is not followed by an open parenthesis it is processed with no arguments.
Macro names consist of a leading alphabetic or underscore possibly followed by alphanumeric or underscore characters, e.g., valid macro names match the pattern “[a-zA-Z_][a-zA-Z0-9_]*”.
In arguments to macros, leading unquoted space, tab, and newline
(‘\n’) characters are ignored. To quote strings, use left and
right single quotes (e.g., ‘ this is a string with a leading
space’). You can change the quote characters with the
changequote
built-in macro.
Most built-ins do not make any sense without arguments, and hence are not recognized as special when not followed by an open parenthesis.
The options are as follows:
-D
name[=value],
--define
=name[=value]NULL
).-d
[[+|-]flags],
--debug
=[[+|-]flags]If "+" or "-" is used, the specified flags are added to or removed from the set of active trace flags, respectively; otherwise, the specified flags replace the set of active trace flags.
Specifying this option without an argument is equivalent to specifying it with the argument "aeq".
By default, trace is set to "eq".
-E
,
--fatal-warnings
-E
flag is
specified, if warnings are issued, execution continues but
m4
will exit with a non-zero exit status. When
multiple -E
flags are specified, execution will
halt upon issuing the first warning and m4
will
exit with a non-zero exit status. This behaviour matches GNU m4 1.4.9 and
later.-G
,
--traditional
-g
below).-g
,
--gnu
translit
handles simple character ranges (e.g.,
‘a-z’), regular expressions mimic Emacs behavior, multiple
m4wrap
calls are handled as a stack, the number of
diversions is unlimited, empty names for macro definitions are allowed,
undivert
can be used to include files, and
eval
understands ‘0rbase:value’
numbers.
In macOS, this option is on by default. Use
-G
to revert to traditional behavior.
-I
dirname,
--include
=dirname-o
filename,
--error-output
=filename-P
,
--prefix-builtins
define
, use
m4_define
.-s
,
--synclines
-t
macro,
--trace
=macro-U
name,
--undefine
=namem4
provides the following built-in macros.
They may be redefined, losing their original meaning. Return values are null
unless otherwise stated.
builtin
(name)changecom
(startcomment,
endcomment)# This is a comment
With no arguments, comments are turned off. With one single argument, the end comment sequence is set to the newline character.
changequote
(beginquote,
endquote)`Here is a quoted string'
With no arguments, the default quotes are restored. With one single argument, the close quote sequence is set to the newline character.
decr
(arg)define
(name,
value)defn
(name,
...)divert
(num)m4
concatenates all the queues in numerical order
to produce the final output. Initially the output queue is 0. The divert
macro allows you to select a new output queue (an invalid argument passed
to divert causes output to be discarded).divnum
dnl
dumpdef
(name,
...)errprint
(msg)esyscmd
(cmd)m4
.eval
(expr[,radix[,minimum]])expr
(expr)eval
.format
(formatstring,
arg1, ...)ifdef
(name,
yes, no)NULL
. The word "unix" is
predefined.ifelse
(a,
b, yes,
...)ifelse
() returns the
third argument yes. If the match fails the three
arguments are discarded and the next three arguments are used until there
is zero or one arguments left, either this last argument or
NULL
is returned if no other matches were
found.include
(name)-I
on the command line,
then the environment variable M4PATH
, as a
colon-separated list of directories. Include aborts with an error message
if the file cannot be included.incr
(arg)index
(string,
substring)index(the quick brown fox jumped, fox)
returns
16). If the second argument is not found index returns -1.indir
(macro,
arg1, ...)len
(arg)m4exit
(code)m4wrap
(todo)EOF
, usually for cleanup purposes (e.g.,
m4wrap("cleanup(tempfile)")
causes the
macro cleanup to be invoked after all other processing is done).
Multiple calls to
m4wrap
()
get inserted in sequence at the final EOF
.
maketemp
(template)mkstemp
.mkstemp
(template)paste
(file)patsubst
(string,
regexp, replacement)popdef
(arg,
...)pushdef
ed definition for each
argument.pushdef
(macro,
def)define
, but it saves
the definition on a stack for later retrieval by
popdef
().regexp
(string,
regexp, replacement)shift
(arg1,
...)sinclude
(file)include
, except it ignores any
errors.spaste
(file)paste
(), except it ignores any
errors.substr
(string,
offset, length)syscmd
(cmd)sysval
syscmd
.traceon
(arg,
...)traceoff
(arg,
...)translit
(string,
mapfrom, mapto)undefine
(name1,
...)undivert
(arg,
...)unix
__line__
__file__
The m4
utility exits 0 on success,
and >0 if an error occurs.
But note that the m4exit
macro can modify
the exit status, as can the -E
flag.
B. W. Kernighan and D. M. Ritchie, The M4 Macro Processor, AT&T Bell Laboratories, Computing Science Technical Report, 59, July 1977.
The m4
utility is compliant with the
IEEE Std 1003.1-2008 (“POSIX.1”)
specification.
The flags [-dEGgIPot
] and the macros
builtin
, esyscmd
,
expr
, format
,
indir
, paste
,
patsubst
, regexp
,
spaste
, unix
,
__line__
, and __file__
are
extensions to that specification.
maketemp
is not supposed to be a synonym
for mkstemp
, but instead to be an insecure temporary
file name creation function. It is marked by IEEE Std
1003.1-2008 (“POSIX.1”) as being obsolescent and should
not be used if portability is a concern.
The output format of traceon
and
dumpdef
are not specified in any standard, are
likely to change and should not be relied upon. The current format of
tracing is closely modelled on gnu-m4
, to allow
autoconf
to work.
The built-ins pushdef
and
popdef
handle macro definitions as a stack. However,
define
interacts with the stack in an undefined way.
In this implementation, define
replaces the top-most
definition only. Other implementations may erase all definitions on the
stack instead.
All built-ins do expand without arguments in many other
m4
.
Many other m4
have dire size limitations
with respect to buffer sizes.
Ozan Yigit <oz@sis.yorku.ca> and Richard A. O'Keefe <ok@goanna.cs.rmit.OZ.AU>.
GNU-m4 compatibility extensions by Marc Espie <espie@cvs.openbsd.org>.
June 21, 2023 | Mac OS X 13 |