Suchen

Definition „Cmake / Make“ Der Unterschied zwischen CMake und Make

| Autor / Redakteur: chrissikraus / Stephan Augsten

Werkzeuge wie Make oder CMake sind für das Build-Management zuständig. In der Software-Erstellung übernehmen entsprechende Tools wiederkehrende, zeitraubende und fehleranfällige Aufgaben.

Firma zum Thema

Auf der Webseite CMake.org finden sich nützliche Beispiele und Ressourcen für das Build-Management.
Auf der Webseite CMake.org finden sich nützliche Beispiele und Ressourcen für das Build-Management.
(Bild: CMake.org)

Make und CMake sind Build-Management-Tools, die zur Automatisierung von Software-Erstellung verwendet werden. Make übernimmt wiederkehrende, simple Aufgaben, die alternativ in Einzelschritten per Konsole ausgeführt werden müssten. Dank Automatisierung vermeidet das Werkzeug Fehler beim Build und ermöglicht somit reproduzierbare und zuverlässige Ergebnisse. CMake generiert automatisiert formale Beschreibungen des Erstellungsprozesses für unterschiedliche Plattformen.

Make: die Anfänge der Build-Management-Tools

Make entstand 1976, um den komplexen Erstellungsprozess für Software unter Unix simpler und effizienter zu gestalten. Zuvor war es üblich, den Build per Konsole manuell in Einzelschritten zu steuern.

Die schrittweise Verarbeitung war notwendig, weil die damalige Hardware stark limitiert war und somit keine größeren Operationen zuließ. Je komplexer ein Projekt war, desto unübersichtlicher wurde folglich dieser ohnehin schon monotone Prozess. Selbst bei sorgfältiger Arbeit konnten sich schnell kleine Fehler einschleichen.

Die Idee hinter Make war daher, den Build mittels formaler Beschreibung automatisch zu regeln und somit zuverlässiger und zeitsparender zu gestalten. Diese Beschreibung enthält eine Art Bauanleitung der zu erstellenden Datei und kann mit dem Kommando „make“ in der Konsole aufgerufen werden. Das Tool übernimmt den mühseligen Erstellungsprozess und baut so automatisch eine ausführbare Datei aus den Vorgaben.

Make kann zudem Abhängigkeiten auflösen und entscheidet mittels des Änderungszeitpunkts einer Datei, ob diese neu generiert werden muss. Make muss nicht zwangsläufig für Software verwendet werden. Es kann ganz allgemein aus Quelldateien neue Dateien erstellen und ist daher sehr vielseitig einsetzbar. Inzwischen hat Make viele Ableger wie CMake, NMAKE oder GNU Make inspiriert.

CMake: plattformunabhängiges Build-Management-Tool

CMake ist ein plattformübergreifendes Tool (Cross-platform Make), das Makefiles für unixoide Betriebssysteme wie Linux oder macOS sowie für Windows generiert. Außerdem unterstützt CMake verschiedene C/C++-Compiler und Linker. Darüber hinaus kann das Tool auch mit Java und Fortran umgehen.

Ein wichtiger Unterschied zum klassischen Make ist, dass CMake selbst keine ausführbaren Dateien erzeugt. Stattdessen generiert es Informationen, die von anderen Tools verwertet werden können.

Bevor es CMake gab, musste für jede Plattform und für jeden Compiler und Linker manuell ein eigenes Makefile geschrieben werden. CMake automatisiert diesen Prozess mittels plattformunabhängiger Bauanweisungen für Makefiles. Das Werkzeug kann bequem über eine grafische Oberfläche bedient werden. Alternativ können die einzelnen Funktionalitäten auch über die Konsole genutzt werden.

Makefiles: Baupläne für die Software-Erstellung

Sowohl Make als auch CMake arbeiten mit Beschreibungsdateien, den sogenannten Makefiles. Diese Dateien enthalten alle Anweisungen, die zum Bauen einer Anwendung erforderlich sind, zum Beispiel Pfade und Abhängigkeiten. Das Makefile ist sozusagen die Bauanleitung, nach der aus einzelnen Komponenten ein ausführbares Programm erstellt wird.

Ihren Ursprung haben Makefiles in der Unix-Welt. Längst wird auch unter Windows damit gearbeitet. Die Beschreibungsdateien für Make werden von Hand erstellt und beziehen sich exakt auf die Plattform, mit der man arbeiten möchte. CMake automatisiert das Erstellen von Makefiles.

CMakeLists: Der Bauplan für den Bauplan

CMake kann automatisch und mit geringem Aufwand Beschreibungsdateien für mehrere Plattformen generieren. Beim Kompilieren der Software liegt dann automatisch der jeweils passende Bauplan für das gewünschte System vor. Hierzu benötigt das Tool zunächst eine formale Beschreibung, die CMakeLists.

Darin finden sich alle relevanten Parameter und Anweisungen zum Generieren eines Makefiles, zum Beispiel der Name des Projekts oder eine Liste der benötigten Quelldateien. Diese Anweisungen sind wesentlich kompakter und übersichtlicher als das eigentliche Makefile und somit besser wartbar und leichter verständlich.

Außerdem ist es so relativ simpel, Änderungen schnell auf allen unterstützten Plattformen zu integrieren, da aus ein und derselben Datei unterschiedliche Makefiles generiert werden können. Die Makefiles selbst verändert man in der Regel nicht mehr von Hand.

Alternativen zum Makefile

Mit CMake können noch weitere Formate aus der CMakeLists generiert werden, darunter Ninja Build-Files, Projekte für KDEvelop oder XCode und Solutions für Visual Studio. Es ist also möglich, CMake flexibel mit verschiedenen IDEs zu verwenden.

Vom Makefile zur ausführbaren Datei

Aus dem fertigen Makefile kann Make selbst eine ausführbare Datei erstellen. Das Tool organisiert das Bauen und Linken der Software mit den Mitteln, die der Entwickler im Makefile festgelegt hat.

CMake hingegen generiert nur die Bauanleitungen für diverse Compiler und Entwicklungsumgebungen. Diese Anweisungen müssen den jeweiligen nativen Tools übergeben werden, damit aus den Quelldateien ein lauffähiges Programm wird. Beispiel: Mit CMake kann man Makefiles für NMAKE generieren und diese dann in Visual Studio ausführen, um ein ausführbares Programm zu erhalten.

(ID:45467282)