---
name: "m4"
section: "1"
platform: "linux"
package: "m4"
version: "1.4.21-2"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd", "openbsd"]
url: "https://new.carta.tech/m4"
---

# m4(1)

macro processor

## NAME

m4 - macro processor

## SYNOPSIS

**m4** \[*OPTION*\]... \[*FILE*\]...

## DESCRIPTION

Process macros in FILEs.  If no FILE or if FILE is \`-', standard input is read.

Mandatory or optional arguments to long options are mandatory or optional for short options too.

### Operation modes:

- **--help**

  display this help and exit

- **--version**

  output version information and exit

- **-E**, **--fatal-warnings**

  once: warnings become errors, twice: stop execution at first error

- **-i**, **--interactive**

  unbuffer output, ignore interrupts

- **-P**, **--prefix-builtins**

  force a \`m4\_' prefix to all builtins

- **-Q**, **--quiet**, **--silent**

  suppress some warnings for builtins

- **--warn-macro-sequence**\[=*REGEXP*\]

  warn if macro definition matches REGEXP,

-

  default \\$\\({\[^}\]\*}\\\|\[0-9\]\[0-9\]+\\)

### Preprocessor features:

- **-D**, **--define=NAME**\[=*VALUE*\]

  define NAME as having VALUE, or empty

- **-I**, **--include**=*DIRECTORY*

  append DIRECTORY to include path

- **-s**, **--synclines**

  generate \`#line NUM "FILE"' lines

- **-U**, **--undefine**=*NAME*

  undefine NAME

### Limits control:

- **-g**, **--gnu**

  override **-G** to re-enable GNU extensions

- **-G**, **--traditional**

  suppress all GNU extensions

- **-H**, **--hashsize**=*PRIME*

  set symbol lookup hash table size \[65537\]

- **-L**, **--nesting-limit**=*NUMBER*

  change nesting limit, 0 for unlimited \[0\]

### Frozen state files:

- **-F**, **--freeze-state**=*FILE*

  produce a frozen state on FILE at end

- **-R**, **--reload-state**=*FILE*

  reload a frozen state from FILE at start

### Debugging:

- **-d**, **--debug**\[=*FLAGS*\]

  set debug level (no FLAGS implies \`aeq')

- **--debugfile**\[=*FILE*\]

  redirect debug and trace output to FILE (default stderr, discard if empty string)

- **-l**, **--arglength**=*NUM*

  restrict macro tracing size

- **-t**, **--trace**=*NAME*

  trace NAME when it is defined

### FLAGS is any of:

- a

  show actual arguments

- c

  show before collect, after collect and after call

- e

  show expansion

- f

  say current input file name

- i

  show changes in input files

- l

  say current input line number

- p

  show results of path searches

- q

  quote values as necessary, with a or e flag

- t

  trace for all macro calls, not only traceon'ed

- x

  add a unique macro call id, useful with c flag

- V

  shorthand for all of the above flags

If defined, the environment variable \`M4PATH' is a colon-separated list of directories included after any specified by \`-I'.

Exit status is 0 for success, 1 for failure, 63 for frozen file version mismatch, or whatever value was passed to the m4exit macro.

## AUTHOR

Written by Rene' Seindal.

## REPORTING BUGS

Report bugs to: bug-m4@gnu.org\
 GNU M4 home page: \<https://www.gnu.org/software/m4/\>\
 General help using GNU software: \<https://www.gnu.org/gethelp/\>

## COPYRIGHT

Copyright © 2026 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later \<https://gnu.org/licenses/gpl.html\>.\
 This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

## SEE ALSO

The full documentation for **m4** is maintained as a Texinfo manual.  If the **info** and **m4** programs are properly installed at your site, the command

-

  **info m4**

should give you access to the complete manual.
