Wird die direkte Verwendung von Make als veraltet angesehen? [geschlossen]

31

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?

JParrilla
quelle
8
Für kleine, persönliche Projekte reicht ein makeohne Makefile aus. Was zum Ärger?
ott--
8
Jede verfügbare Software auf meinen FreeBSD-Systemen, sowohl auf dem Desktop als auch auf den Servern, verfügt über ein Makefile, das mit make gestartet wird. Nein. 'Make' ist nicht überholt.
Rob
3
Es steht den Benutzern frei, IDEs zu verwenden. Wenn ihre IDEs jedoch keine Projekte unterstützen können, die Makefiles verwenden make, sollten sie nicht erwarten, dass sie dies umgehen.
Miles Rout
1
Das "obsolete Gerede über Make" ist nur ein Symptom oder ein Schmerzpunkt , keine Proklamation der Ablehnung. Vor allem, wenn es noch keinen überlegenen vollständigen Ersatz gibt und alle Ansätze zur Schmerzreduzierung immer noch in gewisser Weise angewendet werden, nur vor den Benutzern verborgen, die am anfälligsten für die Schmerzen sind. Obwohl viele gute Antworten gegeben wurden, ist die Frage selbst grenzwertig.
Rwong
1
CMakeist eine Abstraktionsschicht. Diese Abstraktion wird benötigt, um die wilde Vielfalt von Consumer-IDE-Produkten zu zähmen, die Open Source nicht entsprechen Makefile. 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.
Shuva

Antworten:

30

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.

Ixrec
quelle
9
POSIX makeist auch plattformübergreifend.
Blrfl
6
@Blrfl Das mag wahr sein, aber im Allgemeinen werden Sie feststellen, dass die Befehlszeilen, die Sie zum Kompilieren und / oder Verknüpfen Ihres Projekts benötigen, plattformspezifisch sind, selbst wenn alle Plattformen, auf die Sie abzielen, POSIX-kompatibel sind und selbst wenn Sie ‚wieder den gleichen Compiler auf alle mit (noch lästigen Problemen mit Standorten von Include - Dateien sein werden, ob Sie brauchen -lm, -lnslund so weiter , oder ob diese Einrichtungen in der C - Bibliothek enthalten sind, usw.).
Jules
5
@Jules Es gibt viel mehr (oder weniger) zu tun. Es ist CMakeim 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), CMakeplö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.
Ext3h
Gleiches gilt für Q make (obwohl es nicht das schlecht dokumentierte inkonsistente Verhalten ist ** ap CMake), btw;)
mlvljr
11

Ist das makewirklich 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 makewar veraltet, wäre dasselbe wie das Sprichwort, dass das Schreiben von benutzerdefinierten Linkerskripten veraltet war.

Aber was raw makenicht 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 CMakejedoch 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, CMakeso 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 CMakesicherlich nicht für alle Szenarien geeignet. Wenn Sie jedoch in einer solchen standardisierten Umgebung arbeiten CMakeoder 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 CMakeFrameworks zu Ihrem Arbeitsablauf passt.

Ext3h
quelle
Make ist zwar nützlich, aber ein schreckliches System mit Kopf, arkaner Syntax und vielen unnötigen Einschränkungen, die für viele Momente sorgen.
Am
7

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 ".

Brendan
quelle
1
Was ist die Alternative? Ändert die Alternative das Konzept von Builds, wie wir es kennen, grundlegend?
JParrilla
1
@Darkslash: Wenn Sie erst einmal über (hypothetische) Alternativen nachgedacht haben, ist dies wie das Öffnen von Schleusen - Sie stellen am Ende alles in Frage (und haben dann Ideen wie die Trennung von Semantik und Syntax sowie die Neugestaltung von IDEs und Tools und die Bereitstellung als Gruppe anstatt einzelner Teile der größeres Puzzle). Praktischer ist es zu erkennen, dass Tools wie cmakenur 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.
Brendan
5
Makefiles sind in keiner Weise "umständlich und unordentlich". Sie sind unglaublich elegant: Sie bilden die Grundlage makefür das Durchlaufen eines azyklischen Abhängigkeitsgraphen. Nichts über "Skripte" oder die Befehlszeile ist "archaisch".
Miles Rout
1
@MilesRout: Der umständliche und unübersichtliche Teil ist die Diagrammkonstruktion. Die Durchquerung ist elegant genug. Aber nehmen Sie nur das häufigste Beispiel für den chaotischen Teil: C-Header-Dateien. Jedes #includeist eine Kante, makekann jedoch C-Dateien nicht analysieren. Immer noch kein Problem, da makediese Kanten mit dem nächsten Knoten (der * .o-Datei) gespeichert werden könnten , aber das tut es auch nicht.
MSalters
3
Ich stimme nicht zu, dass ein besseres Design möglich ist. makeist nicht nur zum Kompilieren von C! Sie wollen ein Programm, das s nimmt .cund .hDateien und gibt Makefile. Aber das ist nicht so makeund das sollte auch nicht so makesein. Auch hier geht makees nicht nur um C, und eine in C integrierte spezifische Lösung makeist eine schlechte Idee (und im Übrigen ein Verstoß gegen die UNIX-Philosophie).
Miles Rout
5

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 mit M-x visit-tags-table:

find $(SRC_DIR) $(TEST_DIR) -regex ".*\.[ch]\(pp\)?" -print | etags -

Oder für die Ada-Entwicklung:

find $(SRC_DIR) $(TEST_DIR) -name "*.ad?" -print | etags -
Patrick
quelle
2

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.

James Tocknell
quelle
1

Ich denke nicht, dass menschliche Schriften Makefileüberholt sind, besonders wenn:

  1. mit POSIX machen, die Sie eine tragbare gibt Makefile
  2. oder mit GNU make 4, das Ihnen viele sehr interessante Funktionen bietet, insbesondere GUILE-Skriptfähigkeit, die es ermöglicht, die ausgefallenen Funktionen von MakefileGeneratoren 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).
Basile Starynkevitch
quelle
0

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 && ./blahein 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.

Miles Rout
quelle
"Kompiliert praktisch überall" -> "Kompiliert auf den neuesten Unix-ähnlichen Systemen". Ich glaube nicht, dass dies autotoolsauf einem Windows-System in relevantem Maße funktioniert (mit Abzug von Cygwin / MingW, einem wirklich Unix-ähnlichen System über Windows).
sleske
Es hat nichts damit zu tun, neu zu sein. Der Vorteil von Autotools ist, dass es auf jedem POSIX-ähnlichen Remote-System funktioniert. Windows ist etwas POSIX-konform.
Miles Rout
Ja, ich stehe korrigiert. Eigentlich erinnere ich mich, dass eine Kritik an Autotools genau darin besteht, dass sie auch für sehr alte Systeme Code enthält. Ich stehe aber immer noch zum Windows-Teil.
Sleske
Die Schuld dafür liegt ganz bei Microsoft. Wenn es ihnen um die Herstellung eines Qualitätsprodukts gehen würde, würde Windows die internationalen Betriebssystemstandards (wie POSIX) ordnungsgemäß unterstützen. POSIX ist nicht nur eine "Unix-Sache", sondern der tragbare Betriebssystemstandard für alle Betriebssysteme. Windows ist nur ein nicht konformer Müllhaufen.
Miles Rout
@MilesRout ist immer noch das Fazit, dass "praktisch überall" 90% Desktop-Computer ausschließt .
el.pescado
-2

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

user3629249
quelle
1
Das hat nicht beantworten , warum bevorzugt makeüber cmakeoder umgekehrt.
Ext3h
Die Verwendung von Makefiles erstellt nicht jedes Mal alle Dateien neu. (
Andernfalls