C ++ Build Systems - Was ist zu verwenden? [geschlossen]

136

Ich möchte ein neues Projekt in C ++ starten - zunächst nur in meiner Freizeit - und untersuche die verfügbaren Build-Systeme. Es scheint, dass die Antwort "Viele, und sie sind alle schrecklich" ist.

Die Funktionen, die ich speziell dafür benötige, sind:

  1. C ++ 11-Unterstützung
  2. Plattformübergreifend (Linux als Hauptziel, kann aber auch auf mindestens Windows aufbauen)
  3. Anständige Unterstützung für Unit-Tests
  4. Unterstützung für mehrere Module zum Trennen von Code
  5. Unterstützung für die Codegenerierung (Verwendung von asn1c oder protobuf - noch nicht 100% sicher)
  6. Leicht zu pflegen

Jetzt weiß ich, dass ich mit CMake und Autotools problemlos 1-4 davon ausführen kann. Wahrscheinlich auch mit SCons und Waf und den anderen. Das Problem ist, dass ich nie herausgefunden habe, wie man die Codegenerierung mit ihnen korrekt durchführt - das sind Quelldateien, die erst existieren, wenn der Erstellungsprozess zum ersten Mal ausgeführt wird. Daher müssen Quelldateien, die das Erstellungssystem in ausführbaren Code konvertieren kann weiß aber erst, wenn der Build startet ... (ASN1C generiert insbesondere Dutzende von Header- und Quelldateien, die zusammenarbeiten müssen, und der tatsächliche Satz von Dateien hängt vom Inhalt Ihrer ASN-Datei ab.) auch die Tatsache, dass keines davon besonders einfach zu warten ist - CMake und Autotools haben ihre eigenen riesigen Skripte, die Sie verwalten müssen, damit sie funktionieren.

Also - welche Build-Systeme werden für so etwas empfohlen? Oder werde ich vorerst mit Make-Dateien und Shell-Skripten nicht weiterkommen?

Graham
quelle
11
"Es scheint, dass die Antwort 'Viele, und sie sind alle schrecklich' ist", ist auch mein Eindruck (mit der Hinzufügung von 'aus meiner Sicht schrecklich'; ich mag es nicht, mit Begriffen wie diesen zu viel zu verallgemeinern ). Genau aus diesem Grund habe ich mein eigenes eingerichtet, und es hat besser geklappt als erwartet, da es das tut, was ich will und wie ich immer wollte, dass die Dinge funktionieren. Für etwas weniger Zeitaufwand müssen Sie wahrscheinlich die vorhandenen Tools durchgehen und eines auswählen, das Ihnen weniger Kopfschmerzen bereitet als die anderen.
Christian Stieber
4
Versuchen Sie es mit tup .
Kerrek SB
siehe auch: stackoverflow.com/q/3349956
ergosys
8
Welche Art von C ++ 11-Unterstützung erwarten Sie von einem Build-System? Dies ist etwas, das Sie vom Compiler erhalten. Das Build-System analysiert oder liest nicht einmal die tatsächlichen Quelldateien, sondern gibt sie nur an denjenigen weiter, der sie benötigt, nicht wahr?
Baruch
5
Es stimmt, aber es wäre gut, dem Compiler die Verwendung der C ++ 11-Unterstützung zu erleichtern. g ++ braucht ein Flag, klirrt einen anderen Satz, msvc braucht anscheinend kein und so weiter. Außerdem wäre die Unterstützung zum Erkennen der verfügbaren C ++ 11-Funktionen hilfreich, da sich diese auch zwischen den Compilern unterscheidet ...
Graham

Antworten:

117

+1 für "Viele, und sie sind schrecklich."

Aber das "reichste" und "skalierbarste" ist wahrscheinlich CMake , ein Makefile-Generator (generiert auch natives MSVC ++ *.proj/ *.sln). Seltsame Syntax, aber sobald Sie sie gelernt haben, können Sie Builds für verschiedene Plattformen erstellen. Wenn ich "frisch anfangen" würde, würde ich wahrscheinlich verwenden CMake. Es sollte Ihre Liste behandeln, obwohl Ihre "Code-Generierung" über das Build-System hinaus ein "Eigenleben" annehmen könnte, je nachdem, was Sie tun möchten. (Siehe unten.)

Für einfache Projekte ist der QMake- Generator in Ordnung (Sie müssen die Qt-Bibliotheken nicht verwenden, um QMake zu verwenden). Sie beschreiben jedoch nicht "einfach" - Codegenerierung und "Extraphasen" bedeuten, dass Sie wahrscheinlich CMakeetwas mit einer umfangreichen API für Ihre eigenen Erweiterungen wie Scons(oder Waf) möchten .

Wir verwenden Scons bei der Arbeit. Es produziert "kugelsichere Builds", aber es ist sehr langsam. Kein anderes System ist so kugelsicher wie Scons. Aber es ist langsam. Es ist in Python geschrieben und wir haben die Schnittstelle für unsere "Workspace-Organisation" erweitert (wo wir lediglich Modulabhängigkeiten angeben), und das ist Teil der SconsEntwurfsabsicht (diese Art der Erweiterung durch Python). Praktisch, aber Builds sind langsam. Sie erhalten kugelsichere Builds (jede Entwicklerbox kann die endgültige Version erstellen), aber es ist langsam. Und es ist langsam. Vergessen Sie nicht Scons, dass es langsam ist , wenn Sie es verwenden . Und es ist langsam.

Es macht mich krank zu glauben, dass wir ein Jahrzehnt nach dem Jahr 2000 immer noch keine fliegenden Autos haben. Wir werden wahrscheinlich noch hundert Jahre warten müssen oder so, um sie zu bekommen. Und dann werden wir wahrscheinlich alle in unseren fliegenden Autos herumfliegen, die noch mit beschissenen Bausystemen gebaut werden.

Ja, sie sind alle schrecklich.

[ÜBER CODE-GENERATION]

Sconsarbeitet an "Phasen" und sie sind "etwas statisch". Es kann Code erstellen, der als Teil des Builds generiert wird (die Leute tun dies auf verschiedene Arten), aber dies wurde als "etwas sehr Un-Scons-ähnliches" beschrieben.

Wenn es einfach ist, "einige Dateien vorzuverarbeiten und Quelldateien zu generieren", dann kein Problem (Sie haben viele Optionen, und aus diesem Grund qmakewurde geschrieben - für die mocVorverarbeitung von *.hpp/*.cppDateien).

Wenn Sie dies jedoch auf "schwere Weise" tun, müssen Sie Ihr eigenes Skript erstellen. Zum Beispiel hatten wir als Teil des Builds Skripte, die die Datenbanken abfragten und C ++ - Klassen generierten, um eine Schnittstelle zwischen den "Ebenen" herzustellen (in der traditionellen dreistufigen Anwendungsentwicklung). In ähnlicher Weise haben wir Server- / Client-Quellcode über IDLs und eingebettete Versionsinformationen generiert, damit mehrere Clients / Server gleichzeitig mit verschiedenen Versionen ausgeführt werden können (für denselben "Client" oder "Server"). Viel generierter Quellcode. Wir könnten "so tun", als wäre es "das Build-System", aber tatsächlich ist es eine nicht triviale Infrastruktur für das "Konfigurationsmanagement", von dem ein Teil das "Build-System" ist. Zum Beispiel musste dieses System "abnehmen" und "

charley
quelle
37
Ich mag Scons auch - aber ich denke, es ist langsam.
Lothar
1
Sie können CMake veranlassen, die Codegenerierung mit einem Makefile-Wrapper durchzuführen, um eine optionale zweite Phase durchzuführen, wenn Code generiert wird. Ich konnte die vollständige Abhängigkeitsverfolgung, das vorzeitige Beenden nach der Codegenerierung unterstützen, um ein erneutes Erstellen auszulösen usw. Siehe: javaglue.com/javaglue.html#tag:JavaGlue und code.google.com/p/javaglue
sdw
3
Halten Sie SCons nach fast zwei Jahren immer noch für langsam? Als ich ein Build - System entschieden hat , stieß ich auf diese und es trug zu meiner Entscheidung mit SCons zu gehen.
JBentley
2
@ Ben, das stimmt, aber es ist auch langsam.
Charley
2
Wer sich das ansieht, sollte Meson in Betracht ziehen (der Ninja verwendet).
Matthew D. Scholefield
33

Sie können Gradle jetzt verwenden: https://docs.gradle.org/current/userguide/native_software.html

Dies scheint in den Jahren, seit ich dies ursprünglich gepostet habe, ziemlich gereift zu sein. Die Seite, auf der steht, dass das Projekt "inkubiert", ist verschwunden, aber ich kann keine offizielle Ankündigung finden, die diesen Status entfernt.

Nate Glenn
quelle
Ich würde Gradle zustimmen. Gradle ist skalierbar. Es hängt jedoch von der Plugin-Implementierung ab, wie schnell es ist. Es gibt auch etwas Overhead für Gradle selbst. Beachten Sie auch, dass einige Plugins möglicherweise für Ihre Anwendungsfälle angepasst werden müssen.
JE42
Interessant, Gradles Interesse an der Unterstützung von C ++ zu sehen. Ich hoffe, sie produzieren ein schönes und solides Bausystem für C ++ - Projekte, das uns allen fehlt.
Hbobenicio
@squid danke, aktualisiert.
Nate Glenn
1
Gradle ist mächtig und doch einfach. Keine seltsame Syntax, eine einzelne gradle.build-Datei reicht oft aus, um ein gesamtes Projekt mit mehreren ausführbaren Ausgaben (main, tests usw.) zu erstellen. Kein Datei-Dumping in allen Quellverzeichnissen. Super freundlich zum versionieren.
Overdrivr
1
Ich habe die letzten zwei Tage damit verbracht, mit Gradle zu kämpfen und nur versucht, eine "Hallo Welt" -Bibliothek, eine App und Tests zu erstellen, und ich kann nicht sagen, dass ich sie für ein neues Projekt empfehlen kann. Die Tools sind möglicherweise alle vorhanden, die Dokumentation jedoch nicht (im Zweifelsfall). Vielleicht könnten diejenigen von Ihnen, die es für brauchbar halten, auf Ihre Lieblingsressourcen verweisen?
JWM
16

Ich habe diese gefunden, ich habe sie noch nicht alle persönlich benutzt:

Ninja , ein kleines Build-System, das sich auf Geschwindigkeit konzentriert. Google verwendet jetzt Ninja, um Android anstelle von Make: link zu erstellen .

Shake , ein leistungsstarkes und schnelles Build-System.

Tup , ein Hochleistungs-Build-System. Algorithmisches Design. Analyse von Tup .

Alle sind jetzt plattformübergreifend und unterstützen Windows. Ich bin mir über den Rest Ihrer Anforderungen noch nicht sicher, da ich sie noch nicht selbst getestet habe. Sie werden in der kommerziellen Entwicklung eingesetzt, CIG hat Ninja abgeholt. Ich habe die Leichtigkeit und Geschwindigkeit von Ninja mit einem Projektgenerator verwendet und liebe sie. Die ersten beiden ähneln Scons, Ant usw.

leetNightshade
quelle
1
Tup wird Symbol-Lookups durcheinander bringen, spielt mit keinem anderen Build-System gut (überhaupt nicht), spielt nicht gut mit zufälligen Ausgaben (wie Klassen, die javacmit inneren Klassen generiert wurden , die in class$1.classDateien getrennt sind ) schlecht geschrieben und verwendet System-Hacks, um das zu erreichen, was es tut. Es ist großartig für kleine Systeme; nicht wartbar für größere Projekte.
Qix - MONICA wurde am
@Qix: Können Sie die Ausgabe nicht von Ihrem Repository trennen?
Kerrek SB
1
@ KerrekSB Sie können, aber das ist nicht das Problem bei der Symbolsuche. Tup verwendet FUSE und stellt seine eigene Middleware bereit .tup/mnt. Anschließend werden alle Build-Programme in einem Ordner (dh .tup/mnt/@tupjob-XXXXX) als Arbeitsverzeichnis ausgeführt, um Lese- / Schreibvorgänge zu überwachen und die Build-Konfiguration zu erzwingen. Es funktioniert gut, es sei denn, der Pfad ist absolut gespeichert (dh mit Symbolen). Wenn Sie eine Binärdatei kompilieren, wird der Symbolpfad in der Binärdatei selbst gespeichert. Das heißt, wenn GDB versucht, die Symbole zu laden, sucht es nach dem tupjobPfad, der nicht existiert und Fehler verursacht.
Qix - MONICA wurde am
Sowohl Tup als auch Ninja sind sehr einfache Werkzeuge, so niedrig oder immer niedriger als Make. Sie sind nicht auf C ++ zugeschnitten. Ich würde diese Tools nicht einmal als eigenständige Build-Systeme bezeichnen, da ihnen viele wichtige übergeordnete Funktionen fehlen, die echte Build-Systeme für komplexe Projekte in der realen Welt bieten. Einige dieser Systeme verwenden möglicherweise Ninja als Back-End.
Johan Boulé
11

Scons ist ein sehr freundliches und flexibles System, aber Sie haben Recht, Lothar, es ist sehr langsam.

Es gibt jedoch eine Möglichkeit, die Leistung von in Python geschriebenen Programmen zu steigern. Diese Verwendung der JIT. Von allen bekannten Projekten ist PyPy eine sehr leistungsstarke, schnell wachsende und motivierte JIT-gestützte Python 2.7-Implementierung. Die PyPy-Kompatibilität mit Python 2.7 ist einfach unglaublich. Scons wurde jedoch im PyPy-Kompatibilitäts-Wiki als nicht unterstütztes Projekt deklariert . Waf hingegen, das als Python-basierter Autotool-Nachfolger modelliert ist, wird von der PyPy-Infrastruktur vollständig unterstützt. In meinen Projekten hat sich die Geschwindigkeit der Montage beim Übergang zu PyPy um das 5- bis 7-fache erhöht. Sie können die Leistungsberichte von PyPy anzeigen .

Für ein modernes und relativ schnelles Build-System ist Waf eine gute Wahl.

Aegor
quelle
Es ist erwähnenswert, dass Scons auf der verlinkten Wiki-Seite jetzt als "Kompatibel" markiert sind, sodass es anscheinend jetzt mit PyPy funktioniert.
Gefälschter Name
8

Das Google Build-System ist eine gute Alternative: http://bazel.io/

Mike B.
quelle
3
"Plattformübergreifend (Linux als Hauptziel, kann aber auch auf mindestens Windows aufbauen)". In den häufig gestellten Fragen von Bazel heißt es: "Wir arbeiten derzeit aktiv an der Verbesserung der Windows-Unterstützung, aber es ist noch nicht möglich, sie zu verwenden."
Michael Mrozek
3
Ich bin mir nicht sicher, ob es das System selbst oder der Typ ist, der das Projekt eingerichtet hat, aber ich hatte große Schmerzen im Rücken, als ich es @ work verwendete. Es ist sehr unflexibel (in dem Sinne, dass es nur eine Art unterstützt, Dinge zu tun, oft suboptimal, wenn nicht gruselig), nicht leistungsfähig genug, schlecht dokumentiert (abgesehen von einfachen Fällen), hat wenig Community, also erwarten Sie nicht, dass der Stackoverflow Sie rettet , eine ziemliche Abhängigkeit für sich, spielen Sie mit den meisten IDEs auf den meisten Systemen usw. usw. nicht gut. Wenn Sie also kein Google-Fan sind, halten Sie sich davon fern (übrigens gibt es eine Facebook-Version davon namens Buck -. für Facebook-Fans)
Slava
Hey, ich fand es wirklich einfach zu bedienen, nachdem ich 6 Wochen lang versucht hatte, CMake zum Laufen zu bringen. Ich wollte, dass es Abhängigkeiten von Drittanbietern herunterlädt und kompiliert (da ich es gewohnt war, Tools aus Python und JavaScript zu erstellen). Dies machte es einfach, hat aber den Nachteil, dass Sie möglicherweise Ihre eigenen Bazel-Dateien für Dritte schreiben müssen, die dies nicht unterstützen. Sie brauchen ein zentrales Repo, um diese zu speichern.
CpILL
6

Ich habe SCons verwendet und bin von diesem Build-System beeindruckt. SCons ist durch Python und Python selbst erweiterbar - es ist großartig, denn Python verfügt über alles, was Sie benötigen. Codieren Sie einfach die Logik. Alle Funktionen auf niedriger Ebene sind bereits in SCons und Python implementiert und plattformübergreifend. Wenn Sie über gute Programmierkenntnisse verfügen, sehen Ihre Build-Skripte perfekt und einfach aus.

Make, CMake und ähnliche Build-Systeme scheinen ein Müll von Makros zu sein. Waf ist SCons analog. Ich versuche es mit Waf, aber SCons werden freundlicher sein und so blieb ich bei SCons.

Nach Meinung der Zuschauer ist SCons zu langsam, aber mitten in einem Projekt habe ich keinen Unterschied zwischen make und SCons nach Build-Geschwindigkeit gesehen. Stattdessen hat SCons gut mit parallelen Builds gearbeitet, während make große Probleme damit hat.

Mit SCons können Sie außerdem Konfigurationen erstellen, erstellen, bereitstellen, Konfigurationen aus Vorlagen generieren, Tests ausführen und alle anderen Aufgaben ausführen, die mit Python und SCons codiert werden können - alles in einem. Das ist ein sehr großer Vorteil.

Für ein einfaches Projekt ist CMake auch eine gute Wahl.

Torsten
quelle
3
Mein Problem hier ist, dass ich verwöhnt bin. Ich bin von Beruf Java-Entwickler, und Tools wie Gradle in der Java-Welt sind die Tools, die ich wirklich gerne für die C ++ - Entwicklung hätte. Ich kann ein Gradle-Projekt ohne externe Abhängigkeiten mit einer einzeiligen Build-Datei einrichten. Das ist es. Projekte mit mehreren Modulen, die zahlreiche Abhängigkeiten aufweisen, sind ebenfalls noch einfach durchzuführen und wiegen sogar viel weniger Konfiguration als selbst ein einfaches C ++ - Projekt ...
Graham,
Ich hatte Probleme beim Erstellen anderer Pakete, die Scons verwenden, da sie keine Systemkonfigurationsflags wie -I include dirs und -L library dirs abstrahieren. CFLAGS werden nicht benötigt. Oft müssen Sie jedes Scons-Skript ändern, damit es an der richtigen Stelle angezeigt wird.
ACyclic
5

Nur um meine Cent hinzuzufügen: Premake

http://industriousone.com/premake

Es gibt auch eine eigene Webseite im Wiki.

user827992
quelle
2
Leider unterstützt Premake die Codegenerierung gemäß den Anforderungen des OP nicht. Und ich würde die Unterstützung für Unit-Tests nicht als "anständig" bezeichnen, obwohl Sie einige Dinge tun können.
Ergosys
@ergosys Ich bemerke, dass Ameise nicht erwähnt wird, antunterstützt auch C / C ++, sehen Sie, ob dies gut für Sie ist, es ist der Nachname, den ich habe, ich benutze nur Makefiles und Cmake dafür.
user827992
2

Sie können Ceedling verwenden . Beachten Sie jedoch, dass es derzeit nur C unterstützt und eng mit den Unity- und CMock-Test-Frameworks des Autors verbunden ist.

Es kann gegabelt und modifiziert werden, um ziemlich einfach mit einem C ++ - Compiler und einem Unit Testing / Mocking Framework zu arbeiten.

Auch Tup ist eine Erwähnung wert. Es ist extrem schnell, aber es weiß nichts über das Testen von Frameworks usw., was bedeutet, dass Sie Ihr eigenes Build-System mit Tup schreiben müssen. Wenn Sie planen, TDD zu machen, ist Tup wahrscheinlich der richtige Weg.

thegreendroid
quelle