Was sind die Unterschiede zwischen Autotools, Cmake und Scons?
Was sind die Unterschiede zwischen Autotools, Cmake und Scons?
Antworten:
In Wahrheit ist Autotools 'einzige wirkliche' Rettungsgnade ', dass es das ist, was alle GNU-Projekte größtenteils verwenden.
Probleme mit Autotools:
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 ...
Die Beispiele für CMake in diesem Thread sind etwas falsch.
Jedoch...
In Wahrheit sollten Ihre Ziele bestimmen, was Sie hier wählen.
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.
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.
asciidoc
oder help2man
oder doxygen
oder, 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.
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_mflags
In 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.
./configure CFLAGS=-O0
schlä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
).
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.
AUTOMAKE_OPTIONS = -foreign
in Ihrem deaktiviert werden Makefile.am
. (Oder -foreign
in Ihrem autogen.sh
. Ich denke, fast jeder benutzt dies.)
installcheck
und zu bauen distclean
. Wenn Sie versuchen, dieses Verhalten zu ändern, während Sie noch Autotools verwenden, verschwenden Sie nur Ihre Zeit.
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.