Kapitel 1. Das Makefile.am Howto

Inhaltsverzeichnis

Makefile.am für ein einfaches Programm
bin
*_SOURCES
*_LDADD
*_LDFLAGS
AM_CPPFLAGS
KDE_CXXFLAGS
METASOURCES
Makefile.am für Shared Libraries
*_LTLIBRARIES
*_LIBADD
*_LDFLAGS
Makefile.am für ein Plugin / Modul
Code wiederverwenden: Komfortbibliotheken (*.a)
Makefile.am für automatisierte Tests
Installation von Daten
Deinstallation einer Desktop-Datei
Symbole (Icons)
Andere Arten von Quelldateien
Unterverzeichnisse
Verzeichnisse höchster Ebene
Dokumentation
Übersetzungen
Reines Qt-Programm
"final" Kompilierung Ausschalten
Was Du niemals tun solltest!
Mach ein Makefile aus einer Makefile.am

Makefile.am für ein einfaches Programm

bin_PROGRAMS = kdialog

kdialog_SOURCES = kdialog.cpp widgets.cpp ...
kdialog_LDADD = $(LIB_KIO)
kdialog_LDFLAGS = $(all_libraties) $(KDE_RPATH)

AM_CPPFLAGS = $(all_includes)

METASOURCES = AUTO

bin

bin bedeutet, Du möchtest etwas erzeugen, was in das bin Verzeichnis von KDE installiert wird. *_PROGRAMS bedeutet, Du möchtest ein Programm erzeugen, welches kompiliert werden muss. Verwende _SCRIPTS für Skripte, u.s.w. Dann kannst Du den Namen des Programms sehen. Dieser Name wird in den Zeilen unterhalb verwendet, um das Programm zu definieren, für welches dort die Optionen zum Erzeugen desselben definiert werden.

*_SOURCES

Hier führst Du alle Sourcen auf, aus denen das Programm übersetzt wird.

*_LDADD

Hier definierst Du mit welchen Bibliotheken das Programm verlinkt wird. Du kannst nur -lfoo, ..Pfad/zur/Bibliothek.la (nur relative Pfade), oder die $(LIB_*) Makros verwenden, welche vom KDE Build System bereitgestellt werden. Wenn eine Bibliothek A von einer Bibliothek B abhängt, musst Du B nicht angeben. Aber wenn Du beide angibst (z.B. weil sich die Abhängigkeiten von A ändern können), stelle sicher, dass du A vor B angibst. Lokale .a Bibliotheken kommen also an erster Stelle, dann $(LIB_*). dann -lfoo, wenn nötig.

*_LDFLAGS

Zuletzt definierst Du die Flags, die an den Linker übergeben werden müssen, in *_LDFLAGS. Das können -L Flags sein (üblicherweise vom configure Lauf in eine Variable gesetzt). $(all_libraries) beinhaltet alle -L Flags, die nötig sind, um QT und KDE zu finden, diese Angabe musst Du hier haben. Für Programme solltest Du $(KDE_RPATH) verwenden, es hilft den Programmen, ihre Bibliotheken zu finden ohne dass LD_LIBRARY_PATH gesetzt sein muss.

AM_CPPFLAGS

Zusätzliche Flags für den Compiler. Diese Variable muss $(all_inlcudes) enthalten. An dieser Stelle sind auch weitere Flags für den Übersetzungslauf vorzugeben, wie -DWITHOUTBUGS und -I$(srcdir)/subdir, um eigene Header in Unterverzeichnissen zu finden. WICHTIG: Füge -I Vorgaben immer vor $(all_includes) ein. Damit stellst Du sicher, dass die eigenen Header verwendet werden, nicht etwa ältere bereits früher installierte Versionen.

Beachte, dass $(srcdir) und . (das Build-Verzeichnis) immer automatisch eingebunden sind. Du wirst in vielen bestehenden KDE-Anwendungen Makefile.ams finden, die noch die Variable INCLUDES verwenden. Das war der alte Name für diese Variable, aber man sollte heutzutage nur noch AM_CPPFLAGS verwenden.

KDE_CXXFLAGS

Dann gibt es noch die KDE_CXXFLAGS. Dessen Rolle ist es, andere Flags anzuhängen, womit das ein oder andere vom Build Framework gesetzte Flag überschrieben werden kann. Das ist zum Beispiel der Fall, wenn man Exceptions einsetzen möchte, welche grundsätzlich ausgeschaltet sind. Wenn Du Exceptions verwenden möchtest, musst Du

KDE_CXXFLAGS = $(USE_EXCEPTIONS)
eintragen.

METASOURCES

METASOURCES = AUTO
ist die magische Zeile, die das KDE Build System dazu bringt, sich um die moc Dateien automatisch zu kümmern. Es ist der empfohlene Weg, wenn alle Deine .cpp/.cc Dateien ihre .moc Datei inkludieren (das ist der beste Weg, denn es führt zu einer schnelleren Übersetzung), oder wenn Du ein einzelnes Binärprogramm oder eine einzelne Bibliothek übersetzt.

Solltest Du mehrere Binärdateien / Bibliotheken übersetzen wollen, solltest Du die längere Form verwenden:

libirgendwas_la_METASOURCES = meinedatei.moc meineanderedatei.moc
meinbinaerprogramm_METASOURCES = eineanderedatei.moc