Was sind die Unterschiede zwischen Autotools, Cmake und Scons?

259

Was sind die Unterschiede zwischen Autotools, Cmake und Scons?

Wazery
quelle
Dieses Thema wird bereits im Scons-Wiki behandelt . Ich schlage vor, dass Sie die folgenden Links besuchen: 1. scons.org/wiki/SconsVsOtherBuildTools Haben Sie einen sehr ähnlichen Diskussionsthread im Ubuntu-Forum besucht ?
Bhadra
Sie können dieses PDF überprüfen www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; Es hat Vor- und Nachteile sowie einige Details zu jedem Tool.
Adam

Antworten:

190

In Wahrheit ist Autotools 'einzige wirkliche' Rettungsgnade ', dass es das ist, was alle GNU-Projekte größtenteils verwenden.

Probleme mit Autotools:

  • Wirklich ARCANE m4-Makrosyntax kombiniert mit ausführlichem, verdrehtem Shell-Scripting für Tests auf "Kompatibilität" usw.
  • Wenn Sie nicht aufpassen, Sie werden vermasseln Querübersetzbarkeit Fähigkeit (Es ist deutlich zu beachten, dass Nokia mit Scratchbox / Scratchbox2 zu Neben Schritt kam sehr gebrochen Autotools Build - Setups für Maemo / Meego.) Wenn Sie für jede Wenn Sie feste, statische Pfade in Ihren Tests haben, werden Sie die Cross-Compile-Unterstützung unterbrechen, da Ihre Sysroot-Spezifikation nicht eingehalten wird und Inhalte aus Ihrem Host-System entfernt werden. Wenn Sie die Cross-Compile-Unterstützung unterbrechen, wird Ihr Code für Dinge wie OpenEmbedded unbrauchbar und macht Distributionen, die versuchen, ihre Releases auf einem Cross-Compiler anstatt auf dem Ziel zu erstellen, "Spaß".
  • Führt eine RIESIGE Menge an Tests auf Probleme mit alten, kaputten Compilern durch, die NOBODY derzeit für so ziemlich alles verwendet , was heutzutage produziert wird . Sofern Sie nicht so etwas wie glibc, libstdc ++ oder GCC auf einer wirklich alten Version von Solaris, AIX oder dergleichen aufbauen , sind die Tests Zeitverschwendung und eine Quelle für viele, viele mögliche Fehler von Dingen wie oben erwähnt.
  • Es ist ziemlich schmerzhaft, ein Autotools-Setup zu erstellen, um verwendbaren Code für ein Windows-System zu erstellen. (Obwohl ich Windows nur wenig benutze, ist es ein ernstes Problem, wenn Sie angeblich plattformübergreifenden Code entwickeln.)
  • Wenn es kaputt geht, wirst du STUNDEN damit verbringen , deinen Schwanz zu jagen und zu versuchen, die Dinge zu sortieren, die derjenige, der das Scripting geschrieben hat, falsch gemacht hat, um deinen Build zu sortieren (in der Tat ist es das, was ich versuche (oder besser gesagt) Autotools komplett herausreißen - ich bezweifle, dass im Rest dieses Monats genug Zeit bleibt , um das Chaos zu beseitigen ...) für die Arbeit, während ich dies schreibe. Apache Thrift hat eines dieser BROKEN- Build-Systeme, die sich nicht kreuzen lassen -kompilieren.)
  • Die "normalen" Benutzer werden eigentlich NICHT einfach "./configure; make" ausführen - für viele Dinge werden sie ein Paket abrufen, das von jemandem bereitgestellt wurde, beispielsweise aus einem PPA oder ihrem Distributionsanbieter. "Normale" Benutzer sind keine Entwickler und greifen in vielen Fällen nicht nach Tarballs. Das ist Snobismus von allen Seiten, wenn man annimmt, dass dies dort der Fall sein wird. Die typischen Benutzer für Tarballs sind Entwickler, die Dinge tun, also werden sie mit der Zerbrochenheit überhäuft, wenn es da ist.

Es funktioniert ... meistens ... ist alles, was Sie über Autotools sagen können. Es ist ein System, das mehrere Probleme löst, die nur das GNU-Projekt betreffen ... für ihren grundlegenden Kern-Toolchain-Code. (Bearbeiten (24.05.2014): Es sollte beachtet werden, dass diese Art von Bedenken eine potenziell SCHLECHTE Sache ist, über die man sich Sorgen machen muss. Heartbleed ist teilweise auf dieses Denken zurückzuführen und mit korrekten, modernen Systemen wirklichIch habe nichts damit zu tun, was Autotools korrigiert. GNU muss wahrscheinlich eine Cruft-Entfernung der Codebasis durchführen, angesichts dessen, was mit Heartbleed passiert ist.) Sie können es für Ihr Projekt verwenden, und es funktioniert möglicherweise gut für ein kleines Projekt, von dem Sie nicht erwarten, dass es irgendwo anders als unter Linux oder wo funktioniert Die GNU-Toolchain funktioniert eindeutig korrekt. Die Aussage, dass es "gut in Linux integriert" ist, ist ziemlich kühn und ziemlich falsch . Es lässt sich relativ gut in die GNU-Toolsuite integrieren und löst Probleme, die die IT mit ihren Zielen hat.

Dies bedeutet nicht, dass es keine Probleme mit den anderen im Thread hier diskutierten Optionen gibt.

SCons ist eher ein Ersatz für Make / GMake / etc. und sieht ziemlich gut aus, alles in allem jedoch ...

  • Es ist immer noch eher ein POSIX-Tool. Sie könnten MinGW wahrscheinlich leichter dazu bringen, Windows-Sachen damit zu erstellen als mit Autotools, aber es ist immer noch wirklich mehr auf POSIX-Sachen ausgerichtet und Sie müssten Python und SCons installieren , um es zu verwenden.
  • Es gibt Probleme beim Cross-Compilieren, es sei denn, Sie verwenden etwas wie Scratchbox2.
  • Zugegebenermaßen langsamer und weniger stabil als CMake aus ihrem eigenen Vergleich. Sie haben halbherzige (die POSIX-Seite benötigt make / gmake, um zu bauen ...) Negative für CMake im Vergleich zu SCons. (Nebenbei bemerkt , wenn Sie so viel Erweiterbarkeit gegenüber anderen Lösungen benötigen , sollten Sie sich fragen, ob Ihr Projekt zu kompliziert ist ...)

Die Beispiele für CMake in diesem Thread sind etwas falsch.

Jedoch...

  • Sie müssen eine neue Sprache lernen.
  • Es gibt kontraintuitive Dinge, wenn Sie an Make, SCons oder Autotools gewöhnt sind.
  • Sie müssen CMake auf dem System installieren, für das Sie erstellen.
  • Sie benötigen einen soliden C ++ - Compiler, wenn Sie keine vorgefertigten Binärdateien dafür haben.

In Wahrheit sollten Ihre Ziele bestimmen, was Sie hier wählen.

  • Sie benötigen mit einem umgehen LOT gebrochener Werkzeugketten eine gültige Arbeits binär zu produzieren? Wenn ja, sollten Sie Autotools in Betracht ziehen, da Sie sich der oben genannten Nachteile bewusst sind. CMake kann mit vielem fertig werden, macht sich aber weniger Sorgen als Autotools. SCons können erweitert werden, um sich darüber Sorgen zu machen, aber es ist dort keine sofort einsatzbereite Antwort.
  • Müssen Sie sich über Windows-Ziele Gedanken machen? In diesem Fall sollten Autotools buchstäblich außer Betrieb sein. In diesem Fall sind SCons möglicherweise keine gute Wahl. Wenn ja, ist CMake eine gute Wahl.
  • Müssen Sie sich Gedanken über Cross-Compilation machen (universelle Apps / Bibliotheken, Dinge wie Google Protobufs, Apache Thrift usw. SOLLTEN sich darum kümmern ...)? Wenn ja, könnten AutotoolsArbeiten Sie für Sie, solange Sie sich nicht um Windows kümmern müssen, aber Sie werden viel Zeit damit verbringen, Ihr Konfigurationssystem zu warten, wenn sich die Dinge an Ihnen ändern. SCons ist im Moment fast ein No-Go, es sei denn, Sie verwenden Scratchbox2 - es hat wirklich keinen Einfluss auf die Cross-Kompilierung und Sie müssen diese Erweiterbarkeit verwenden und sie auf die gleiche Weise wie pflegen Sie werden mit Automake. In diesem Fall sollten Sie CMake in Betracht ziehen, da es Cross-Compilation unterstützt, ohne dass Sie sich Sorgen machen müssen, dass es aus der Sandbox austritt. Es funktioniert mit / ohne Scratchbox2 und lässt sich gut in OpenEmbedded integrieren.

Es gibt einen Grund, warum viele, viele Projekte qmake, Autotools usw. fallen lassen und zu CMake übergehen. Bisher kann ich davon ausgehen, dass ein CMake-basiertes Projekt entweder in eine Cross-Compile-Situation oder in ein VisualStudio-Setup übergeht oder nur eine geringe Bereinigung benötigt, da das Projekt keine Nur-Windows- oder Nur-OSX-Teile berücksichtigt zur Codebasis. Ich kann das von einem SCons-basierten Projekt nicht wirklich erwarten - und ich gehe davon aus, dass 1/3 oder mehr Autotools-Projekte ETWAS falsch gemacht haben, was verhindert, dass es in jedem Kontext richtig erstellt wird, außer dem Host, der eines oder ein Scratchbox2-Projekt erstellt.

Svartalf
quelle
12
Der Abschnitt, in dem Heartbleed erwähnt wird, lenkt von diesem frustrierten Geschwätz ab. Das Problem bestand darin, dass OpenSSL KEIN Paket vom Typ Konfigurator verwendete, um kaputte Mallocs zu erkennen, sondern Systembibliotheken neu implementierte und Plattformentwickler besiegte, die Bibliotheken erstellten, die Fehler viel früher erkannt hätten. Ein Grund für die Portierung von Programmen ist, dass sie eine höhere Qualität aufweisen, da sie weniger von den kleinen Annahmen abhängig sind, von denen Sie nicht wissen, dass Sie sie machen
Rob11311
9
Die Sache ist, dass es überhaupt nicht davon ablenkt. Mit Autotools machen Sie sich Sorgen, solche Dinge zu kompensieren - diese Neuimplementierungen sind eine ERWEITERUNG dieses Denkens. Sozusagen auf die nächste Stufe bringen. Sie sollten das vor diesem Hintergrund betrachten ... an diesem Punkt wird es überhaupt nicht beeinträchtigt. Sie haben die Grundursache in Ihrer Argumentation nicht herausgearbeitet - genau das, was passiert ist. Ich fingere genau das DENKEN, das es dazu gebracht hat, zusammen mit Shellshock und ein paar anderen, die es mögen. Wenn es kaputt ist, sollten Sie es reparieren. Wenn Sie nicht können, sollten Sie fragen, warum Sie so weitermachen.
Svartalf
5
Ich bezweifle nicht, dass Autotools und Scons scheiße sind, aber diese Antwort macht einen schlechten Job, wenn es darum geht, die Nachteile von CMake (meinem bevorzugten Build-System, nur wegen des sehr, sehr traurigen Zustands von Build-Systemen) festzustellen. Grundsätzlich ist CMake ein Fraktal der Inkonsistenz mit der integrierten Unterstützung für einzelne Randfälle und keine Kernabstraktion, die die meisten Dinge behandelt. Es ist definitiv das Klebeband und der Draht der Programmierung. Ich bin sicher, dass ich etwas falsch mache, aber es unterstützt VisualStudio nur, wenn Sie ein VS-Projekt pro CMakeLists.txt für akzeptabel halten (ich bin kein VS-Benutzer, aber meine Winfriends sagen mir, dass es schlecht ist).
weberc2
5
Im Gegensatz zu anderen verhassten Programmierwerkzeugen gibt es nicht genügend Material, um ein Buch mit dem Titel "CMake, die guten Teile" (möglicherweise eine Broschüre oder ein Blog-Beitrag) zu erstellen, und es ist eher ein Fraktal schlechten Designs als PHP .
weberc2
2
@JAB Ich werde von VS-Benutzern gesagt, dass dies nicht idiomatisch ist. Tatsächlich wurde CMake als Build-System für unser Projekt ersetzt, da niemand herausfinden konnte, wie die "idiomatischen" VS-Projektdateien erstellt werden sollen.
weberc2
73

Es muss wichtig unterschieden werden, wer die Werkzeuge verwendet. Cmake ist ein Tool, das vom Benutzer beim Erstellen der Software verwendet werden muss. Die Autotools werden verwendet, um einen Verteilungstarball zu generieren, mit dem die Software nur mit den Standardtools erstellt werden kann, die auf einem SuS-kompatiblen System verfügbar sind. Mit anderen Worten, wenn Sie Software von einem Tarball installieren, der mit den Autotools erstellt wurde, verwenden Sie die Autotools nicht . Auf der anderen Seite, wenn Sie Software installieren , die CMake verwendet, dann Sie sind Cmake verwenden und muss die Software bauen installiert sein .

Die große Mehrheit der Benutzer muss die Autotools nicht auf ihrer Box installiert haben. In der Vergangenheit wurde viel Verwirrung gestiftet, da viele Entwickler fehlerhafte Tarballs verteilen, die den Benutzer dazu zwingen, Autoconf auszuführen, um das Konfigurationsskript neu zu generieren. Dies ist ein Verpackungsfehler. Mehr Verwirrung wurde durch die Tatsache verursacht, dass die meisten großen Linux-Distributionen mehrere Versionen der Autotools installieren, wenn sie standardmäßig keine von ihnen installieren sollten. Noch mehr Verwirrung wird durch Entwickler verursacht, die versuchen, ein Versionskontrollsystem (z. B. cvs, git, svn) zu verwenden, um ihre Software zu verteilen, anstatt Tarballs zu erstellen.

William Pursell
quelle
5
Es stimmt, obwohl es so klingt, als wäre es schlecht, ein VCS zum Verteilen von Software zu verwenden. Wenn der Inhalt einer Kasse oder eines Klons mit dem Inhalt eines Tarballs übereinstimmt, warum würden Sie Tarballs empfehlen?
d -_- b
5
@Toor Ich verstehe deine Frage nicht. Alle Projekte, an denen ich arbeite, produzieren einen Tarball, der sich von der VCS-Kasse unterscheidet. Das Beibehalten der beiden Elemente hilft bei der zuverlässigen Verteilung.
William Pursell
13
Es ist wahr, dass viele Projekte Leute bitten, das VCS zu verwenden, um die neueste Version zu erhalten, aber das ist nur für Entwickler geeignet. Leider verstehen viele Benutzer den Unterschied zwischen dem Release-Tarball und dem VCS nicht. Der Versuch, aus dem VCS zu erstellen, führt zu mehr Abhängigkeiten. Der Benutzer benötigt möglicherweise asciidocoder help2manoder doxygenoder, was wichtig ist, die richtige Autotool-Kombination. Dies war ein großes Marketingproblem für die Autotools. Benutzer glauben fälschlicherweise, dass Autoconf installiert werden muss, da sie den Unterschied zwischen Tarball und VCS nicht verstehen.
William Pursell
3
Warum kann ein Projekt die Ausgabe, Projektdateien und Makefiles von Cmake nicht für gängige Plattformen verteilen, z. B. Win, Linux und MacOSX? Es scheint die gleiche Situation zu sein wie bei Lex / Yacc-Tools. Sie fügen den generierten C-Code ein, damit er auf Plattformen ohne die Tools erstellt werden kann
Rob11311,
3
Obwohl ich denke, dass die in dieser Diskussion erwähnten Punkte richtig sind, glaube ich, dass diese Diskussion den Punkt verfehlt. Der Benutzer muss eine ganze Reihe anderer Dinge installieren und es sollte kein großes Problem sein, ob er zusätzlich cmake installieren muss oder nicht. Ich würde mich mehr um Bibliotheken, die Compiler-Toolkette und andere Tools kümmern, die zum Erstellen der Software benötigt werden.
Lanoxx
24

Es geht nicht um GNU-Codierungsstandards.

Die aktuellen Vorteile von Autotools - insbesondere bei Verwendung mit Automake - bestehen darin, dass sie sich sehr gut in die Erstellung der Linux-Distribution integrieren lassen.

Bei cmake zum Beispiel ist es immer "War es -DCMAKE_CFLAGS oder -DCMAKE_C_FLAGS, die ich brauche?" Nein, es ist auch nicht "-DCMAKE_C_FLAGS_RELEASE". Oder -DCMAKE_C_FLAGS_DEBUG. Es ist verwirrend - in Autoconf ist es nur ./configure CFLAGS = "- O0 -ggdb3" und Sie haben es.

Bei der Integration in Build-Infrastrukturen tritt bei Scons das Problem auf, das Sie nicht verwenden make %{?_smp_mflags}können. _smp_mflagsIn diesem Fall handelt es sich um ein RPM-Makro, das sich grob auf die Systemleistung erweitert (der Administrator kann dies festlegen). Leute setzen Dinge wie -jNCPUS hier durch ihre Umgebung. Bei Scons, die nicht funktionieren, werden die Pakete, die Scons verwenden, möglicherweise nur in Distributionen serialisiert.

user502515
quelle
8
+1, und die Welt wäre ein besserer Ort, wenn dies wahr wäre. Leider ./configure CFLAGS=-O0schlägt dies häufig mit Paketen fehl, die CFLAGS im Makefile überschreiben und stattdessen die Ausführung durch den Benutzer erfordern ./configure --enable-debug. (zB tmux).
William Pursell
2
Es ist nicht verwirrender als Autotools und wie William zu Recht betont, wird es mit einem falsch eingerahmten CFLAGS = "<foo>" im Makefile zur Hölle gesprengt. Ganz einfach, dies ist ein weiteres dieser "alten Säge" -Elemente. Und die CMake-Beispiele sind falsch ... wieder ... Sie können das erste tun, wenn Sie nicht RELEASE oder DEBUG angeben. SCHEITERN.
Svartalf
17

Was über die Autotools wichtig ist, ist, dass sie kein allgemeines Build-System sind - sie implementieren die GNU-Codierungsstandards und sonst nichts. Wenn Sie ein Paket erstellen möchten, das allen GNU-Standards entspricht, sind Autotools ein hervorragendes Werkzeug für diesen Job. Wenn Sie dies nicht tun, sollten Sie Scons oder CMake verwenden. (Siehe zum Beispiel diese Frage .) Aus diesem häufigen Missverständnis kommt der größte Teil der Frustration mit Autotools.

Ptomato
quelle
11
GNU-Standards können in Automake mit AUTOMAKE_OPTIONS = -foreignin Ihrem deaktiviert werden Makefile.am. (Oder -foreignin Ihrem autogen.sh. Ich denke, fast jeder benutzt dies.)
Dietrich Epp
9
Ja, aber das steuert nur, ob Automake oberflächliche GNU-Regeln erzwingt, z. B. ob eine README-Datei erforderlich ist. Es ändert nichts an der Grundvoraussetzung, einen Tarball im GNU-Stil mit Regeln wie installcheckund zu bauen distclean. Wenn Sie versuchen, dieses Verhalten zu ändern, während Sie noch Autotools verwenden, verschwenden Sie nur Ihre Zeit.
Ptomato
1
Sie ermöglichen (theoretisch) die Erstellung und Installation aller Softwarepakete auf genau dieselbe Weise.
Ptomato
Sie ermöglichen es Ihnen theoretisch, mit BROKEN-Compilern und Betriebssystemen angemessener umzugehen als mit anderen Tools und oberflächliche Regeln wie @ptomato anzuwenden, die dort hervorgehoben sind. Wenn Sie einen modernen verwenden (sagen GCC oder Klirren ... für Beispiele) Tool auf einem modernen Betriebssystem mit nichts wirklich doof, sagen Linux oder Strom * BSD, nicht wahr NEED die „Regeln“ gibt. Sie machen tatsächlich viel, viel mehr Arbeit für Sie und können nicht anders, ehrlich gesagt für Cross-Compilation. Fast die Hälfte aller Anwendungen wird heutzutage für Embedded Linux und * BSD verwendet. WARUM gehst du mit Dingen, die dir dort nicht helfen können?
Svartalf
Sie sind sich nicht sicher, warum Sie die Antwort abgelehnt haben, da Sie sie in Ihrem Kommentar zu bestätigen scheinen ...?
Ptomato
9

Während aus Entwicklersicht cmake derzeit am einfachsten zu verwenden ist, haben Autotools aus Anwendersicht einen großen Vorteil

Autotools generieren ein einzelnes Dateikonfigurationsskript, und alle zu generierenden Dateien werden mit der Distribution geliefert. es ist leicht zu verstehen und mit Hilfe von grep / sed / awk / vi zu beheben. Vergleichen Sie dies mit Cmake, wo sich viele Dateien in / usr / share / cmak * / Modules befinden, die vom Benutzer nur repariert werden können, wenn er über Administratorzugriff verfügt.

Wenn also etwas nicht ganz funktioniert, kann es normalerweise leicht mithilfe von Standard-Unix-Tools (grep / sed / awk / vi usw.) auf Vorschlaghammer-Art "repariert" werden, ohne das Buildsystem verstehen zu müssen.

Haben Sie jemals Ihr cmake-Build-Verzeichnis durchsucht, um herauszufinden, was falsch ist? Im Vergleich zu dem einfachen Shellscript, das von oben nach unten gelesen werden kann, ist es ziemlich schwierig, den generierten Cmake-Dateien zu folgen, um herauszufinden, was los ist. Bei CMake erfordert das Anpassen der FindFoo.cmake-Dateien nicht nur Kenntnisse der CMake-Sprache, sondern möglicherweise auch Superuser-Berechtigungen.

gebogen
quelle
7
Ich glaube nicht, dass Probleme mit Autotools im Vergleich zu CMake "leicht zu beheben" sind ...
sleske
7
Weil Autotools ein komplexes System sind (genau wie CMake). Wenn Sie der Meinung sind, dass Autotools "leicht zu beheben" sind (es kann Gründe geben, dies zu glauben), wäre es meiner Meinung nach gut, in der Antwort zu erklären, auf welche Weise Probleme leichter zu beheben sind.
Sleske
5
Autotools generieren ein einzelnes Dateikonfigurationsskript, und alle zu generierenden Dateien werden mit der Distribution geliefert. es ist leicht zu verstehen und mit Hilfe von grep / sed / awk / vi zu beheben. Vergleichen Sie dies mit Cmake, wo sich viele Dateien in / usr / share / cmak * / Modules befinden, die vom Benutzer nur repariert werden können, wenn er über Administratorzugriff verfügt. Haben Sie jemals Ihr cmake-Build-Verzeichnis durchsucht, um herauszufinden, was falsch ist? Verglichen mit dem einfachen Shellscript, das von oben nach unten gelesen werden kann, ist es ziemlich schwierig, den generierten Cmake-Dateien zu folgen, um herauszufinden, was los ist
am
2
Ja, das macht Sinn, danke. Ich habe mir erlaubt, es Ihrer Antwort hinzuzufügen. Fühlen Sie sich frei, zurückzusetzen :-).
Sleske
1
Sie können immer Ihre eigene lokale Version von cmake verwenden. Es gibt keinen Grund, das zu verwenden, was auf Systemebene installiert ist. Für alle, die plattformübergreifend arbeiten, ist das völlig normal. es ist sicherlich die Art, wie ich cmake die meiste Zeit benutze.
James Moore