Schon früh nach der Einführung von Compilern und mit dem Aufkommen der ersten, großen Softwareprojekte wurde klar, dass ein System benötigt wurde, welches den komplizierten und fehlerträchtigen Prozess der Umwandlung von Quellcode zu lauffähiger Software koordiniert. Natürlich lässt sich bis zum heutigen Tag jeder Compiler manuell ohne eine solche Automatisierung aufrufen und für Mini-Projekte mag dies auch ausreichend sein, dennoch kommt man heutzutage nicht um ein ausgefeiltes Build System herum, welches diese Aufgabe erledigt. Das Problem dabei ist nur, dass es eine unermessliche Anzahl solcher Systeme gibt, sowohl im Bereich der freien als auch der proprietären Software. Hinzu kommen moderne IDEs, welche ebenfalls derartige Features integrieren.
Gerade bei quelloffener Software können die GNU Autotools als Platzhirsch bezeichnet werden. Aufgrund ihre langen Verfügbarkeit und der langjährigen Unix-Erfahrung der GNU-Entwickler bieten diese einen großen Funktionsumfang, gelten allgemein jedoch als komplex und schwer verständlich. Aus diesem Grund sind mit QMake, CMake, Scons, Waf und vielen weiteren nennenswerte Alternativen entstanden, die an dieser Stelle ebenfalls untersucht werden sollen.
Alle Build Systeme sollen anhand desselben Beispiels untersucht werden. Es handelt sich um ein einfaches C-Programm, das neben der Standard C-Blbiothek noch libcaca braucht, um compiliert und gelinkt zu werden. Somit wird verhindert, dass ein einfache Aufruf von gcc ohne weitere Parameter genügt. libcaca ist eine einfache Ascii Art-Bibliothek mit wenig Systemanforderungen. Sie wurde gewählt, da sie relativ kompakt ist und eine einfache API besitzt, welche das Testprogramm nicht unnötig verkompliziert.
Datei build_test.c |
---|
/* |
Das Programm zeichnet zwei Boxen mit einem "Hello, World!"-Text und einem Hinweis, dass das Programm mit ESC beendet werden kann. Da hierfür eine einfache Polling-Schleife verwendet wird, ist das Warten sehr CPU-intensiv. Auf eine Verbesserung dessen via usleep() und dergleichen wird dennoch verzichtet.
In den folgenden Unterkapiteln werden verschiedene Varianten des Testprogramms verwendet, um auch Situationen nachzustellen, in denen aus mehreren Quelldateien mehrere Objektdateien entstehen. Trotz dieser Abweichungen bleibt das Ausgangsprogramm aber immer das gleiche,
Folgende Lösungsansätze werden auf jeweils einer eigenen Seite näher beschrieben: