m4 ist ein universeller Makroprozessor für Unix: Er liest Text mit eingebetteten Makro-Aufrufen, expandiert die Makros und gibt den erweiterten Text aus. Entwickelt wurde m4 1977 in den Bell Labs von Dennis Ritchie und Brian Kernighan als Frontend für die Programmiersprache Ratfor. GNU m4 ist die heute verbreitete Implementierung und zugleich Kernkomponente des GNU-Autotools-Bausystems.

Grundlagen

m4 verarbeitet einen Eingabetext von links nach rechts. Alles, was kein Makroaufruf ist, wird unverändert ausgegeben; Makros werden durch ihre Definition ersetzt. Makronamen bestehen aus Buchstaben, Ziffern und Unterstrich; Aufrufe folgen dem Muster name(arg1, arg2, ...).

define(PROGRAMM, Hallo Welt)
PROGRAMM
dnl Kommentar bis Zeilenende
ifdef(PROGRAMM, Programm ist definiert, fehlt)

Wichtige m4-Befehle und Makros

  • define(name, wert) / undefine(name) — Makro definieren bzw. entfernen; pushdef/popdef legen Definitionen auf einen Stapel
  • ifdef(name, dann, sonst) / ifelse(a, b, dann, sonst) — bedingte Expansion
  • dnl — verwirft alles bis zum Zeilenende (Kommentar)
  • include(datei) / sinclude(datei) — Dateien einbinden
  • divert(n) / undivert — Ausgabe in Puffer umleiten
  • translit(zeichenkette, von, nach) — Zeichen ersetzen
  • regexp(text, regex, ersatz) / patsubst(text, regex, ersatz) — reguläre Ausdrücke
  • incr(n), decr(n), eval(ausdruck) — Arithmetik
  • len(s), substr(s, anfang, länge), index(s, teil), format(fmt, ...) — Zeichenketten
  • esyscmd(befehl) / syscmd(befehl) — Shell-Kommando ausführen und Ergebnis einlesen

Praxis: GNU Autotools

Die wichtigste Anwendung von m4 ist Autoconf: Die Datei configure.ac besteht fast vollständig aus m4-Makros. Autoconf expandiert sie und erzeugt daraus das portierbare configure-Shell-Skript, das anschließend das Make-Build konfiguriert.

AC_INIT([mein-programm], [1.0])
AC_PROG_CC
AC_OUTPUT

Aufruf: m4 datei.m4, Definitionen von außen per m4 -DPROGRAMM=Wert, Include-Pfade per m4 -Iverzeichnis, GNU-Erweiterungen per m4 -P. Das erzeugte configure-Skript ist reine Shell, m4 selbst wird danach nicht mehr benötigt.

Praxis-Tipps

  • Makros mit m4_-Präfix (GNU-Modus) vermeiden Kollisionen mit Autoconf-Makros.
  • define erlaubt auch mehrzeilige Werte — praktisch für ganze Textbausteine.
  • m4 ist bewusst minimal: Für moderne Konfigurationen setzen Projekte zunehmend auf deklarative Sprachen wie HCL oder direkt auf Generatoren wie CMake.

Verwandt: Ninja als moderner Build-Ausführer.