Zusammenstellen eines Projektes mittels
configure, automake, autoconf und anderer Autotools
Die Anwendung der «Autotools» macht ein Projekt architektonisch unabhängig und minimiert den Prozess des Schreibens von Makefile.
Hier ist ein Beispiel eines kleinen Projekts, geschrieben in Programmiersprache C:
1. Erstellen wir ein Verzeichnis für das Projekt test
2. Im Verzeichnis test erstellen wir ein Verzeichnis src
3. Im Verzeichnis src erstellen wir eine Datei mit dem Namen main.c
/* src/main.c */ #include "main.h" int main (void) { test (); return 0; }
4. Im Verzeichnis src erstellen wir eine Datei mit dem Namen test.c
/* src/test.c */ #include "main.h" void test (void){ printf("i am test!\n"); }
5. Im Verzeichnis src erstellen wir eine Datei mit dem Namen main.h
/* src/main.h */ #include <stdio.h> extern void test (void);
Für das Zusammenstellen eines solchen Projekts kann das Makefile manuell geschrieben werden, und besser wäre Autotools zu nutzen, die das Makefile automatisch generieren werden.
Für ein automatisches Erstellen von Makefile werden nur zwei Textbausteindatei genutzt - Makefile.am und configure.in. Wobei die erste Datei wird manuell geschrieben, und die zweite wird automatisch generiert und übergearbeitet.
Im Root-Verzeichnis des Projekts (im Verzeichnis test) erstellen wir die Datei " Makefile.am " mit dem folgenden Inhalt:
## Makefile.am SUBDIRS = src
Das Stichwort SUBDIRS bedeutet, dass die Quelldateien für das Zusammenstellen in diesem Verzeichnis sind.
Es ist auch die Datei Makefile.am im Verzeichnis src mit dem folgenden Inhalt zu erstellen:
## src/Makefile.am bin_PROGRAMS = hello hello_SOURCES = main.c main.h test.c
Das Stichwort bin_PROGRAMS gibt den Namen der ausführbaren Datei, die infolge des Zusammenstellens erstellt wird.
Das Stichwort hello_SOURCES wird für die Aufzählung der Dateinamen von Quellcode genutzt, aus denen die Datei «hello» erstellt wird.
Wenn es notig ist eine Bibliothek anzuschließen, ist die folgende Zeile in die Datei hinzuzufügen:
hello_LDADD = -lpthread
So wird die Bibliothek lpthread ngeschlossen.
Wenn eine lag anzugeben ist, wird es wie folgt gemacht:
AM_LDFLAGS = -rdynamic
oder
AM_LDFLAGS = -L. -Wl,-rpath,.
Im letzten Falle wird den Weg angefügt, wo die Bibliothek zu suchen ist. (der Punkt bedeutet "im aktuellen Verzeichnis").
Wenn ein Verzeichnis mit Headers anzuschließen ist, ist es Folgendes hinzuzufügen:
INCLUDES = -I/usr/src/linux-headers-2.6.32-23-generic/include/
Das wäre alles.
Erstellen wir configure.in mit Hilfsmittel autoscan. Dieses Programm erstellt die Datei configure.scan, die der Prototyp von configure.in ist.
Führen wir aus:
autoscan
Bearbeiten wir configure.scan und dann benennen wir sie in configure.in um:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.65]) AC_INIT([hello], [1.0], [info@h-wrt.com]) AC_CONFIG_SRCDIR([src/main.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([stdlib.h]) # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT
Macro AC_INIT. Als Parameter werden folgende übergeben: der Name des Programms, seine Version, email.
Macro AC_CONFIG_SRCDIR. Als Parameter wird der Weg zur Datei übergeben, mit der das Zusammenstellen beginnt.
Macro AM_INIT_AUTOMAKE setzt die Unterstützung Automake ein.
Macro AC_PROG_CC überprüft die Verfügbarkeit und Funktionsfähigkeit des C-Compiles.
Macro AC_OUTPUT dient zur Angabe der Makefile, welche infolge der Ausführung des configure-Skripts erstellt werden.
Das wäre alles! Jetzt führen wir Folgendes aus und Makefile ist bereit.
aclocal - erstellt aclocal.m4.
autoconf - dieser Utility erstellt den Skript configure laut Macros, die in der Datei `configure.in' angegeben sind.
autoheader — erstellt die Header-Datei (config.h.in).
touch NEWS README AUTHORS ChangeLog (diese Dateien werden für automake benötigt)
automake --add-missing - diese Utility erstellt die Dateien "Makefile.in" aus Basis von den Dateien "Makefile.am".
configure — erstellt Makefile
make — stellt ein Projekt zusammen