Viele der Richtlinien in diesem Kapitel sind aus den "Makefile Conventions" für GNU-Programme entnommen (siehe http://www.gnu.org/prep/standards_50.html). Über das automake-Kommando könnnen Makefiles erzeugt werden, die diese Richtlinien unterstützen.
Die Suffix-Liste sollte explizit gesetzt werden:
.SUFFIXES:
.SUFFIXES: .c .o
|
Die erste Zeile löscht die Suffix-Liste, die zweite Zeile setzt dann explizit die gewünschten Endungen.
Grund: Verschiedene make-Varianten haben unterschiedliche und inkompatible Suffix-Listen. Dies kann zu Verwirrungen auf unterschiedlichen Systemen führen.
|
Programme im Arbeitsverzeichnis müssen mit ./programm gestartet werden.
Grund: Das aktuelle Verzeichnis ist nicht immer im Suchpfad enthalten.
|
|
Auch wenn manche make-Varianten sowohl Korn-Shell- als auch Bash-Syntax verstehen, sollte man nur die Bourne-Shell-Syntax verwenden.
|
Folgende Unix-Kommandos können direkt verwendet werden:
cat cmp cp diff echo egrep expr false grep install-info ln ls mkdir mv pwd rm rmdir sed sleep sort tar test touch true
Bei den Optionen sollte man sich auf die gängigen Optionen beschränken, die auf allen Systemen vorhanden sind.
Grund: diese Kommandos sind auf allen Linux- und Unix-Varianten vorhanden
|
Alle übrigen Kommandos wie Compiler-Aufruf und andere Programme sollten in Variablen abgespeichert werden.
Grund: Zum einen ist dies änderungsfreundlicher, zum anderen kann bei Bedarf das Kommando über die Kommandozeile mitgegeben werden.
|
|
Nach Möglichkeit sollten Variablen genauso wie das Kommando heissen und mit dem Namen des Kommandos vorbelegt sein.
Beispiel:
|
Variable |
Wert |
Beschreibung |
AR |
ar |
Archiver (zum Bibliotheken bauen) |
CC |
cc |
C-Compiler |
CXX |
g++ |
C++-Compiler |
CPP |
$(CC) -E |
C-Präprozessor |
FC |
f77 |
Fortran-Compiler |
LD |
ld |
Linker, Loader |
LEX |
lex |
lexikalische Analyse |
MAKE |
make |
make-Kommando |
PC |
pc |
Pascal-Compiler |
YACC |
yacc |
Parser-Generator |
Tipp: Bei der Verwendung von GNU-Make können die vordefinierten Variablen über
user@linux $ make -p -f /dev/null | grep " = "
|
ausgegeben werden.
|
Flags zu Kommandos sollten in einer Variable mit dem Namen des Kommandos und der Endung FLAGS gekennzeichnet werden (s. Tabelle: Flag-Variablen)
Kommando |
Flags |
Beispiel |
Bemerkung |
AR |
ARFLAGS |
rv |
|
CC |
CFLAGS |
-g |
Debug-Flag |
CXX |
CXXFLAGS |
|
|
CPP |
CPPFLAGS |
-DGERMAN |
|
FC |
FFLAGAS |
|
|
LD |
LDFLAGS |
-lm |
math. Bibliothek |
LEX |
LEXFLAGS |
|
|
MAKE |
MAKEFLAGS |
-k |
|
PC |
PFLAGS |
|
|
YACC |
YFLAGS |
-v |
Verbose-Flag |
Abweichend von der obigen Namensgebung werden die Flags für den C-Compiler (CC) mit CFLAGS, für den Fortran-Compiler (FC) mit FFLAGS, für den Pascal-Compiler (PC) mit PFLAGS und für yacc (YACC) mit YFLAGS benannt. Dies hat historische Gründe.
|
Optionen, die für die Kompilation bzw. Erzeugung des Ziels unbedingt notwendig sind, werden nicht in diesen Variablen abgespeichert.
Grund: Es sollte weiterhin möglich sein, Variablen über den make-Aufruf oder über Umgebungs-Variablen zu setzen, ohne dass die Kompilation schief läuft.
Beispiel:
hugo.o : hugo.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) hugo.c
|
|
Die Variable INSTALL muss in jedem Makefile definiert sein und zum Installieren von Dateien dienen.
Daneben sollten die Variablen INSTALL_PROGRAM und INSTALL_DATA definiert werden, die zur Installation von Programmen und Daten dienen. Der Standard-Wert dafür sollte $(INSTALL) sein.
Name |
Standard |
Anmerkung |
INSTALL |
install |
|
INSTALL_PROGRAM |
$(INSTALL) |
Installation von Programmen |
INSTALL_DATA |
$(INSTALL) -m 644 |
Installation von Daten |
Für die Installation von Programmen und Dateien sollte immer der komplette Dateiname und nicht nur der Verzeichnisname verwendet werden.
Beispiel:
install:
$(INSTALL_PROGRAM) love $(bindir)/love
$(INSTALL_DATA) loveletter $(datadir)/loveletter
|
|
|
Installations-Verzeichnisse sollten immer in Variablen abgelegt werden, so dass sich die Installation auch leicht an andere Zielverzeichnisse anpassen lässt.
Standardnamen für solche Variablen werden in diesem Abschnitt beschrieben. Sie basieren auf Standard-Dateisystemen von SVR4, 4.4BSD, Linux, Ultrix V4 und anderer moderner Betriebssysteme.
Aus folgenden zwei Varablen sollten alle weitere Installations-Variablen abgeleitet werden:
prefix: |
Diese Variable enthält das Basis-Verzeichnis. |
exec_prefix: |
Diese Variable enthält das Basis-Verzeichnis für einige ausführbare Programme. Als Standard-Wert enthält diese Variable den Wert von prefix. |
Variable |
Standard |
Beschreibung |
bindir |
$(exec_prefix)/bin |
hier werden die ausführbaren Programme für den Benutzer abgelegt |
sbindir |
$(exec_prefix)/sbin |
hier werden die Programme für den System Administrator abgelegt |
libexecdir |
$(exec_prefix)/libexec |
hier werden die Programme abgelegt, die von anderen Programmen benötigt werden |
datadir |
$(prefix)/share |
für Architektur-unabhängige Daten-Dateien, die nicht verändert werden (read-only) |
sysconfdir |
$(prefix)/etc |
Konfigurations-Dateien (read-only), die zu einer Single-Maschine gehören |
sharedstatedir |
$(prefix)/com |
Architektur-unabhängige Daten-Dateien, die vom Programm verändert werden können |
localstatedir |
$(prefix)/var |
lokale Architektur-unabhängige Daten-Dateien, die vom Programm verändert werden können |
libdir |
$(exec_prefix)/lib |
Objekt- und Bibliotheks-Dateien (keine ausführbaren Programme) |
infodir |
$(prefix)/info |
Info-Dateien |
lispdir |
$(datadir)/emacs/site-lisp |
Emacs-Lisp-Dateien |
includedir |
$(prefix)/include |
Header-Dateien |
mandir |
$(prefix)/man |
Verzeichnis für die Manpages |
man1dir |
$(mandir)/man1 |
"1"er-Manpage |
man2dir |
$(mandir)/man2 |
"2"er-Manpage |
... |
... |
... |
manext |
.1 |
Manpage Erweiterung |
man1ext |
.1 |
"1"er-Manpage Erweiterung |
man2ext |
.2 |
"2"er-Manpage Erweiterung |
... |
... |
... |
srcdir |
- |
Verzeichnis, in dem die Sourcen kompiliert werden |
|
|
all |
Kompilation des gesamten Programms (möglichst mit der Option "-g") sollte das Standard-Ziel sein |
install |
Kompilation und Installation des Programms, der Bibliotheken, usw... |
uninstall |
"install" wieder rückgängig machen |
install-strip |
Installation mit ge-"strip"-ten Programmen (strip entfernt die Symboltabelle aus einem Programm) |
clean |
Löschen aller Dateien, die beim Erstellen des Programms erzeugt werden |
distclean |
lösche alle Dateien, die nicht mehr benötigt werden |
dist |
Distributions-Tarfile erstellen; die Tar-Datei sollte ein Unterverzeichnis mit dem Werkzeugname und Versionsnummer enthalten, in dem sämtliche Programme und Dateien enthalten sind (zum Beispiel love-1.0.1) |
check |
Selbsttest (Überprüfung des Programms) |
|
mostlyclean |
wie "clean", ausser Bibliotheken und andere Dateien, die zeitintensiv zu erstellen sind |
TAGS |
Erstellen/Update einer Tags-Tabelle |
info |
Info-Dateien erstellen |
installcheck |
Installation von Test-Dateien und -Verzeichnissen, die für "check" benötigt werden |
installdirs |
Verzeichnisse, die für "install" erzeugt werden müssen |
|
|
|