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:
- C ++ 11-Unterstützung
- Plattformübergreifend (Linux als Hauptziel, kann aber auch auf mindestens Windows aufbauen)
- Anständige Unterstützung für Unit-Tests
- Unterstützung für mehrere Module zum Trennen von Code
- Unterstützung für die Codegenerierung (Verwendung von asn1c oder protobuf - noch nicht 100% sicher)
- 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?
Antworten:
+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 verwendenCMake
. 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
CMake
etwas mit einer umfangreichen API für Ihre eigenen Erweiterungen wieScons
(oderWaf
) 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 derScons
Entwurfsabsicht (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 nichtScons
, 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]
Scons
arbeitet 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
qmake
wurde geschrieben - für diemoc
Vorverarbeitung von*.hpp/*.cpp
Dateien).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 "
quelle
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.
quelle
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.
quelle
javac
mit inneren Klassen generiert wurden , die inclass$1.class
Dateien 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..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 demtupjob
Pfad, der nicht existiert und Fehler verursacht.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.
quelle
Das Google Build-System ist eine gute Alternative: http://bazel.io/
quelle
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.
quelle
Nur um meine Cent hinzuzufügen: Premake
http://industriousone.com/premake
Es gibt auch eine eigene Webseite im Wiki.
quelle
ant
unterstü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.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.
quelle