Daher habe ich viele Kommentare / Posts / etc zum direkten Erstellen von Makefiles gesehen und wie dumm es ist, das im Jahr 2015 zu tun. Ich kenne Tools wie CMake und benutze CMake tatsächlich ziemlich oft. Die Sache ist, dass CMake nur das Makefile für Sie erstellt und dabei hilft, die Mühe zu beseitigen, es selbst zu tun. Natürlich fügt es eine Menge weiterer großartiger Funktionen hinzu ... aber am Ende ist es immer noch ein Makefile.
Meine Frage ist also: Bezieht sich die obsolete Rede über make auf das gesamte Hilfsprogramm Make oder nur auf die Idee, eigene Makefiles manuell zu schreiben? Ich verwende überhaupt keine IDE für die C / C ++ - Entwicklung (nur Emacs), deshalb habe ich immer Makefiles geschrieben.
Wenn Make als veraltet angesehen wird, was sollte ein C / C ++ - Entwickler verwenden, um kleine, persönliche Projekte zu erstellen?
make
ohne Makefile aus. Was zum Ärger?make
, sollten sie nicht erwarten, dass sie dies umgehen.CMake
ist eine Abstraktionsschicht. Diese Abstraktion wird benötigt, um die wilde Vielfalt von Consumer-IDE-Produkten zu zähmen, die Open Source nicht entsprechenMakefile
. Auch hier handelt es sich nicht nur um eine Abstraktion, sondern ermöglicht auch Konfigurationsfunktionen (wie Autoconf). Wie andere Abstraktionen erlaubt es Alternativen . Aber es ebnet den Weg für eine experimentelle neue Idee von Makefile-Alternativen, die den Benutzern von CMake leicht zugänglich sind.Antworten:
Der große Unterschied besteht darin, dass CMake ein plattformübergreifendes Meta-Build-System ist. Ein einzelnes CMake-Projekt kann das übliche Unix / Linux-Makefile, ein Visual Studio-Projekt für Windows, ein XCode-Projekt für Mac und fast jedes andere Nicht-Meta-Build-System erzeugen, das Sie möglicherweise verwenden oder unterstützen möchten.
Ich würde nicht sagen, dass die direkte oder sogar manuelle Bearbeitung von Makefiles "veraltet" ist, aber das sind Dinge, die Sie wahrscheinlich nicht tun sollten, es sei denn, Sie arbeiten an Unix / Linux-Sachen, die keine Portierung auf Windows erfordern, ähnlich wie Sie sollten Visual Studio-Projektdateien nicht direkt bearbeiten, wenn Sie sie jemals auf Nicht-Windows portieren möchten. Wenn Sie Interesse an Portabilität haben, lohnt es sich, ein Meta-Build-System wie Scons oder CMake zu erlernen.
quelle
make
ist auch plattformübergreifend.-lm
,-lnsl
und so weiter , oder ob diese Einrichtungen in der C - Bibliothek enthalten sind, usw.).CMake
im Wesentlichen auf die Erstellung Ihrer modularen Standardanwendung für Systeme mit ELF-Ladern zugeschnitten und bietet Abstraktionen für alle für diese bestimmte Werkzeugkette erforderlichen Werkzeuge. Wenn Sie von dieser Toolchain abweichen (z. B. benutzerdefiniertes Linker-Skript für Bare-Metal),CMake
plötzlich keine Unterstützung oder Portabilität mehr bieten, hacken Sie es genauso, wie Sie es früher für vollständig benutzerdefinierte Build-Skripte verwendet haben.Ist das
make
wirklich veraltet?Ich glaube nicht. Letztendlich ist make immer noch leistungsfähig genug, um alle gewünschten Funktionen bereitzustellen, z. B. das bedingte Kompilieren geänderter und ähnlicher Quellen. Das Sprichwort
make
war veraltet, wäre dasselbe wie das Sprichwort, dass das Schreiben von benutzerdefinierten Linkerskripten veraltet war.Aber was raw
make
nicht bietet, sind erweiterte Funktionalitäten und Bestandsbibliotheken für mehr Komfort, wie die parametrische Header-Generierung, das integrierte Testframework oder auch nur bedingte Bibliotheken im Allgemeinen.Ist
CMake
jedoch direkt auf die Generierung generischer ELF-Bibliotheken und ausführbarer Dateien zugeschnitten. Wann immer Sie von den vordefinierten Prozeduren abweichen, müssen Sie mit dem Hacken beginnen,CMake
so wie Sie es früher für das Hacken Ihrer eigenen Makefiles getan haben.Wenn man bedenkt, dass man in C ++ weit mehr als nur eine durchschnittliche Anwendung für ein System erstellen kann, das ELF-Lader kennt, ist dies
CMake
sicherlich nicht für alle Szenarien geeignet. Wenn Sie jedoch in einer solchen standardisierten Umgebung arbeitenCMake
oder in einem anderen dieser modernen Skriptgenerator-Frameworks, sind Sie mit Sicherheit am besten befreundet.Es kommt immer darauf an, wie spezialisiert Ihre Anwendung ist und wie gut die Struktur des
CMake
Frameworks zu Ihrem Arbeitsablauf passt.quelle
Es war einmal, dass Hochsprachen nur eine Idee waren. Die Leute versuchten, Compiler zu implementieren. Zu dieser Zeit gab es schwerwiegende Hardwareeinschränkungen - es gab keine grafischen Tools, sodass "Nur-Text" letztendlich für das Eingabedateiformat verwendet wurde. Computer hatten normalerweise eine extrem kleine Menge an RAM, so dass der Quellcode in Teile zerlegt werden musste und der Compiler in separate Dienstprogramme aufgeteilt wurde (Pre-Prozessor, Compiler, Assembler, Linker); CPUs waren langsam und teuer, so dass Sie keine teuren Optimierungen usw. durchführen konnten.
Natürlich ist es mit vielen Quelldateien und vielen Dienstprogrammen, die zum Erstellen vieler Objektdateien verwendet werden, ein Chaos, alles manuell zu erstellen. Als Umgehungslösung für die Konstruktionsmängel in den Tools (die durch stark eingeschränkte Hardware verursacht wurden) begannen die Leute natürlich, Skripte zu schreiben, um einige Probleme zu beseitigen.
Leider waren die Skripte umständlich und chaotisch. Um die Probleme mit Skripten zu umgehen (die eine Problemumgehung für die Konstruktionsfehler in den Tools darstellten, die durch begrenzte Hardware verursacht wurden), erfanden die Leute schließlich Dienstprogramme, um die Dinge einfacher zu machen, wie z
make
.Jedoch; Makefiles sind umständlich und chaotisch. Um die Probleme mit Makefiles zu umgehen (die eine Umgehung für eine Umgehung für die Designfehler in den Tools waren, die durch begrenzte Hardware verursacht wurden), haben die Leute angefangen, mit automatisch generierten Makefiles zu experimentieren. Beginnen wir mit Dingen wie dem Compiler Abhängigkeiten zu generieren. und führt zu Tools wie auto-conf und cmake.
Hier sind wir jetzt: Workarounds für Workarounds für Workarounds für Designfehler in den Tools, die durch eingeschränkte Hardware verursacht werden.
Ich gehe davon aus, dass es bis zum Ende des Jahrhunderts noch ein paar Schichten "Workarounds for Workarounds" auf dem vorhandenen Stapel geben wird. Ironischerweise sind die schwerwiegenden Hardware-Einschränkungen, die all dies verursacht haben, vor vielen Jahrzehnten verschwunden, und der einzige Grund, warum wir heute noch so ein archaisches Durcheinander verwenden, ist " das ist, wie es immer gemacht wurde ".
quelle
cmake
nur Symptome behandeln und die Grundursache (n) nicht heilen können. Das macht es einfacher, die Tatsache zu akzeptieren, dass Sie keine andere Wahl haben, als Werkzeuge zu verwenden, die wahrscheinlich niemals dem Ideal nahe kommen werden.make
für das Durchlaufen eines azyklischen Abhängigkeitsgraphen. Nichts über "Skripte" oder die Befehlszeile ist "archaisch".#include
ist eine Kante,make
kann jedoch C-Dateien nicht analysieren. Immer noch kein Problem, damake
diese Kanten mit dem nächsten Knoten (der * .o-Datei) gespeichert werden könnten , aber das tut es auch nicht.make
ist nicht nur zum Kompilieren von C! Sie wollen ein Programm, das s nimmt.c
und.h
Dateien und gibtMakefile
. Aber das ist nicht somake
und das sollte auch nicht somake
sein. Auch hier gehtmake
es nicht nur um C, und eine in C integrierte spezifische Lösungmake
ist eine schlechte Idee (und im Übrigen ein Verstoß gegen die UNIX-Philosophie).make
(das Tool oder die direkte Verwendung über ein Makefile) ist nicht veraltet, insbesondere für "kleine, persönliche Projekte", für die Sie es verwenden.Natürlich können Sie es auch für größere Projekte verwenden, einschließlich solcher, die auf mehrere Plattformen abzielen. Mit zielspezifischen Variablen können Sie ganz einfach anpassen, wie Sie für verschiedene Plattformen erstellen. Heutzutage werden Linux-Distributionen mit kompilierungsübergreifenden Toolchains geliefert (z. B. mingw-w64 ), sodass Sie ein vollständiges Windows-Softwarepaket (mit Installer, wenn Sie möchten ) aus Linux erstellen können, das alle auf Ihrem Makefile basiert.
Werkzeuge wie cmake und qmake können nützlich sein, sind aber nicht unproblematisch. Sie eignen sich normalerweise gut, um eine Anwendung zusammen mit Bibliotheken selbst zu erstellen (obwohl ich immer Probleme mit der ordnungsgemäßen Abhängigkeitsprüfung zwischen Bibliotheken und Programmen hatte, die sie verwenden), aber ich kämpfe immer mit den Einschränkungen dieser Tools, wenn ich den Rest der Dinge erledige Arbeit (Erstellen von Installationsprogrammen, Generieren / Installieren von Dokumentationen oder Übersetzungsdateien, Verwandeln eines Archivs in eine gemeinsam genutzte Bibliothek usw.). All dies kann in durchgeführt werden
make
, obwohl Dinge wie die Verfolgung von Abhängigkeiten einen kleinen Aufwand erfordern können.IDEs wie Qt Creator und Eclipse können auch Makefile-basierte Projekte importieren, sodass Sie sie mit IDE-Entwicklern teilen können. Ich denke, die Qt Creator-IDE eignet sich hervorragend als C ++ - IDE, aber nachdem ich einige Zeit damit verbracht habe, effizienter mit Emacs umzugehen, und da ich mehr Ada-Entwicklung mache, bevorzuge ich Emacs für alles. Um auf die Frage zurückzukommen
make
, dass ich als Post-Link-Schritt in meinem Makefile meine TAGS-Datei (für die Symbolnavigation in Emacs) aktualisiere , die geladen ist mitM-x visit-tags-table
:Oder für die Ada-Entwicklung:
quelle
Diese Antwort ergänzt die Antwort @lxrec.
Makefiles können für viele Dinge verwendet werden, nicht nur zum Erstellen eines Programms / einer Bibliothek aus Quellcode. Build-Systeme wie CMake oder Autotools sind so konzipiert, dass sie Code aufnehmen und so erstellen, dass er in die Plattform des Benutzers passt (dh Bibliotheken finden oder korrekte Kompilierungsoptionen angeben). Sie könnten zum Beispiel ein Makefile haben, das Ihnen hilft, einige Release-Aufgaben zu automatisieren, wie zum Beispiel: Erstellen einer Zip-Datei mit Code mit der von git abgeleiteten Version; Führen Sie Tests mit Ihrem Code durch. Laden Sie die Zip-Datei zu einem Hosting-Service hoch. Einige Build-Systeme (z. B. automake) bieten möglicherweise eine einfache Möglichkeit, dies zu tun, andere möglicherweise nicht.
Das heißt nicht, dass Sie dafür Makefiles verwenden müssen, Sie könnten für solche Aufgaben eine Skriptsprache (Shell, Python usw.) verwenden.
quelle
Ich denke nicht, dass menschliche Schriften
Makefile
überholt sind, besonders wenn:Makefile
Makefile
Generatoren effizient zu codieren (ich glaube, dass die Funktionen von Autotools oder Cmake leicht durch Guile-Anpassung von GNU make geschrieben werden können ). Natürlich müssen Sie als Preis GNU make 4 verlangen (keine große Sache, IMHO).quelle
Makefiles sind nicht veraltet, genauso wie Textdateien nicht veraltet sind. Das Speichern aller Daten im Nur-Text-Format ist nicht immer die richtige Vorgehensweise. Wenn Sie jedoch nur eine Aufgabenliste benötigen, ist eine Nur-Text-Datei in Ordnung. Für etwas Komplizierteres möchten Sie vielleicht ein komplizierteres Format wie Markdown oder XML oder ein benutzerdefiniertes Binärformat oder irgendetwas dazwischen, aber für einfache Fälle funktioniert normaler Text.
Ebenso ist
g++ -g src/*.c -o blah -W -Wall -Werror && ./blah
ein handgeschriebenes Makefile perfekt , wenn Sie nur vermeiden möchten, ständig zu schreiben !Wenn Sie etwas sehr portables erstellen möchten, bei dem Sie diese Portabilität nicht selbst verwalten müssen, möchten Sie wahrscheinlich, dass Autotools das richtige Makefile für Sie generiert. Autotools erkennt die von verschiedenen Plattformen unterstützten Funktionen. Ein in Standard C89 geschriebenes Programm, das mit Autotools erstellt wurde, kann praktisch überall kompiliert werden.
quelle
autotools
auf einem Windows-System in relevantem Maße funktioniert (mit Abzug von Cygwin / MingW, einem wirklich Unix-ähnlichen System über Windows).Wenn Ihr Projekt einfach ist und nur sehr wenige Dateien enthält, ist keine make-Datei erforderlich.
Wenn das Projekt jedoch komplex ist, zahlreiche Speicherbereiche verwendet, viele Dateien enthält, jeder Speicherbereich an der richtigen Stelle im adressierbaren Speicher platziert werden muss, ist es äußerst wünschenswert, nicht bei jeder geringfügigen Änderung jede Datei neu zu kompilieren gemacht zu einer datei,
Wenn Sie alte Dateien / compile / link / install mit minimalem Aufwand und der Möglichkeit von Tastendruckfehlern löschen möchten, ist das Makefile ein echter Segen.
Wenn Sie in die "reale Welt" Projekte geraten, sind selten nur 1 oder 2 Dateien, sondern Hunderte von Dateien. Ein Makefile führt immer die richtigen und keine unnötigen Aktionen aus (nachdem es debuggt wurde), sodass Sie nur einen einfachen Befehl eingeben und das Makefile die ganze Arbeit erledigt
quelle
make
übercmake
oder umgekehrt.