Ist es sinnvoll, Build-Skripte in C ++ zu schreiben?

15

Ich benutze CMake, um meine Projekte IDE / Makefiles zu generieren, aber ich muss immer noch benutzerdefinierte "Skripte" aufrufen, um meine kompilierten Dateien zu manipulieren oder sogar Code zu generieren.

In früheren Projekten habe ich Python verwendet und es war in Ordnung, aber jetzt habe ich ernsthafte Probleme mit der Verwaltung vieler Abhängigkeiten in zwei sehr großen Projekten, an denen ich arbeite. Daher möchte ich die Abhängigkeiten überall minimieren.

Jemand schlug mir vor, C ++ zu verwenden, um meine Build-Skripte zu schreiben, anstatt nur dafür eine Sprachabhängigkeit hinzuzufügen. Die Projektthemen verwenden bereits C ++, sodass ich verschiedene Vorteile sehe:

  • Um das gesamte Projekt zu erstellen, wären nur ein C ++ - Compiler und CMake erforderlich, sonst nichts (alle anderen Abhängigkeiten sind C oder C ++).
  • Die Sicherheit des C ++ - Typs (bei Verwendung von modernem C ++) macht es einfacher, "richtig" zu werden.
  • Es ist auch die Sprache, die ich besser kenne, damit ich mich besser damit auskenne, auch wenn ich in der Lage bin, guten Python-Code zu schreiben.
  • potenzieller Gewinn an Ausführungsgeschwindigkeit (aber ich denke nicht, dass es wirklich wahrnehmbar sein wird);

Ich denke jedoch, dass es einige Nachteile geben könnte, und ich bin mir nicht sicher, welche Auswirkungen dies haben könnte, da ich es noch nicht versucht habe:

  • Das Schreiben des Codes könnte länger dauern (das heißt, ich bin mir nicht sicher, weil ich in C ++ effizient genug bin, um etwas zu schreiben, das schnell funktioniert. Für dieses System wäre es möglicherweise nicht so lang) (Kompilierungszeit sollte nicht sein.) t ein Problem für diesen Fall sein);
  • Ich muss davon ausgehen, dass alle Textdateien, die ich als Eingabe lesen werde, in UTF-8 vorliegen. Ich bin mir nicht sicher, ob sie zur Laufzeit in C ++ einfach überprüft werden können, und die Sprache prüft sie nicht für Sie.
  • Bibliotheken in C ++ sind schwerer zu verwalten als in Skriptsprachen.

Mir fehlen Erfahrung und Weitsicht, also fehlen mir vielleicht Vor- und Nachteile. Die Frage ist also: Ist es sinnvoll, dafür C ++ zu verwenden? Haben Sie Erfahrungen zu berichten und sehen Sie Vor- und Nachteile, die wichtig sein könnten?

Klaim
quelle
1
Abhängig von einer einzigen Sprache scheint der Interpreter für den Build nicht allzu schlecht zu sein, zumal es sich um Python handelt - sehr portabel, unter Linux weit verbreitet und unter Windows leicht verfügbar. Wenn Sie zusätzliche Python-Bibliotheken benötigen, können Sie virtualenv verwenden, und es wird nur eine Python-Datei (die Sie mitliefern könnten) Internetverbindung und ein bisschen Installationsmaterial hinzugefügt, um das virtualenv einzurichten, sie in der zu installieren und Ihre aktuelle zu starten Erstellen Sie Skripte in dieser Umgebung. Sie könnten ein zusätzliches Skript in Ihrem Build und eine Internetverbindung als Voraussetzung erhalten.
Sie können die Kodierung von Text mit einer ziemlich guten Zuverlässigkeit schätzen.
DeadMG
@DeadMG Ja, aber dies von Hand zu tun, wenn viel zu viel Arbeit anfällt (wenn Sie eine gute Vermutung anstellen und sich nicht auf "Ist dies ASCII oder Unicode, und wenn es Unicode ist, wie viele Bits und welche Bytereihenfolge?") Und Das Hinzufügen einer weiteren Abhängigkeit (wenn es dafür eine freie und freistehende Bibliothek gibt) beseitigt den Punkt des Ablegens auf C ++, um abhängig von Python anzuhalten.
@delnan Ja, aber es muss noch mehr Sprache installiert werden. Ihrer Beschreibung nach scheint eine zusätzliche Abhängigkeit nicht "zu schlecht" zu sein, aber ich denke darüber nach, da es bereits eine Menge zu verwalten gibt, sodass es möglicherweise hilfreich sein kann, die verwendeten Sprachen zu begrenzen. Ich verwende auch eine eingebettete Skriptsprache (die direkt im Projekt in C ++ implementiert ist), Javascript / HTML / CSS, XML und andere Formate, die man sich bereits merken muss.
Klaim,
2
Was werden Sie verwenden, um Ihr C ++ - Build-Skript zu erstellen?
jk.

Antworten:

24

Verwenden Sie einfach Python.

Ich entwickle in C ++ und erstelle meine Build-Skripte in Python, und ich würde es als schmerzhaft empfinden, Build-Skripte in C ++ zu erstellen:

  • Mit Python ist es ganz einfach, Wörterbücher, Listen, verschachtelte Wörterbücher oder Wörterbücher mit Listen usw. zu bearbeiten. (Beispielsweise verwendet eines meiner Skripte eine mehrstufige Hierarchie aller meiner Werkzeuge, Werkzeugversionen und Werkzeugversionspfade. ) C ++ kann dasselbe mit Vorlagen und benutzerdefinierten Klassen tun, ist jedoch weitaus ausführlicher (was zu mehr Codezeilen führt, was im Allgemeinen zu einer geringeren Produktivität führt).
  • Python bietet übergeordnete Bibliotheken und Routinen wie XML- und JSON-Verarbeitung, Subprozess und os.walk . Wiederum kann C ++ dies tun, aber es ist viel mehr Arbeit, die Bibliotheken zu finden, ihre APIs zu erlernen, die Aufrufe (die oft niedriger sind) korrekt zusammenzustellen usw.
  • Erstellungsskripte sind eine Aktivität ohne Mehrwert (um einen Begriff von Lean auszuleihen). Es ist besser, eine möglichst hohe Sprache zu verwenden, um sie so schnell wie möglich zu erledigen und wieder an die Arbeit zu gehen, was Ihren Benutzern zugute kommt.
  • Nach meiner Erfahrung wachsen Build-Skripte in unvorhergesehener Weise. Auch wenn eine Aufgabe für C ++ zunächst einfach zu sein scheint, kann sie schnell kompliziert werden. Wenn eine neue Anforderung auftaucht, ist die Handhabung in einem Python-Skript oft viel einfacher als in C ++ (was möglicherweise das Auffinden oder Lesen neuer Bibliotheks-APIs usw. erfordert).

Zu den Vorteilen, die Sie für C ++ auflisten:

  • Das Hinzufügen einer einzelnen Abhängigkeit (Python) sollte Ihren Build nicht wesentlich komplizieren. Dies ist beispielsweise bei den meisten Linux-Installationen bereits Standard. Dank der Python-Bibliotheken "battery included" ist es möglicherweise sogar einfacher zu verwalten als die C ++ - Bibliotheken, von denen Ihre Build-Skripte abhängen würden.
  • Die Typensicherheit, die C ++ bietet, ist am nützlichsten für große Projekte, nicht für kleine Skripte.
  • Python ergänzt C ++ sehr gut (High-Level im Vergleich zu Lower-Level, dynamisch im Vergleich zu statisch im Vergleich usw.) und kann sogar sehr gut in C ++ integriert werden (dank SWIG und Boost.Python), wenn Sie dies später tun möchten lohnenswert für einen C ++ Programmierer.
  • Wie Sie sagten, sollte die Ausführungsgeschwindigkeit keine Rolle spielen.
Josh Kelley
quelle
Wir haben dies (Python-Builds) nach einem Jahr des Kampfes mit cmake auf einem Cross-Paltform-Projekt gemacht. Am Ende haben wir uns nicht einmal die Mühe gemacht, eine Abhängigkeitsprüfung durchzuführen (der komplexeste Teil eines Builds). Da für automatisierte Builds ohnehin alles neu erstellt werden soll und es in C ++ so viele komplexe Abhängigkeiten gibt
Martin Beckett
1

Ich halte dies für eine fallspezifische Frage. Ich würde behaupten, es gibt keine richtige Antwort, ob es sinnvoll ist, C ++ für Build-Skripte zu verwenden oder nicht. Die einzige Möglichkeit, dies herauszufinden, besteht darin, es in der Praxis auszuprobieren.

Persönlich würde ich Python C ++ überlegen sehen, weil es eine bessere Ausdruckskraft der Sprache und einfachere (persönliche Meinung natürlich) Standardbibliothekstools für die Bearbeitung von Binärdateien und die Generierung von Code bietet. Natürlich könnten hochentwickelte Bibliotheken verfügbar sein, die für diese Aufgabe entwickelt wurden, aber wenn nicht, würde ich persönlich definitiv darauf setzen, dass Python die "häufigere richtige" Antwort ist - im Allgemeinen.

zxcdw
quelle
1

Schreiben Sie keine Skripte selbst, Sie duplizieren den Aufwand und erfinden die Räder neu.

Verwenden Sie so etwas wie SCONS oder sogar Maven 3, das C ++ Build-Systeme unterstützt .

Ein gutes Build-System sollte unabhängig von der Sprache keine benutzerdefinierte Logik in Form von Skripten erfordern, um ein funktionsfähiges ausführbares Artefakt zu erstellen.

Wenn Sie Skripts für ein Build-System schreiben müssen, um es anzupassen, ist es kein gutes Build-System. Das Schreiben eines Plugins für ein Build-System ist eine andere Geschichte, aber das sollte sich hauptsächlich auf eine Umgebung / Hardware beziehen und sollte etwas sein, auf das selten zurückgegriffen wird.


quelle
1
Wie ich bereits erklärt habe, verwende ich cmake, aber ich benötige noch benutzerdefinierte Skripte. Ich spreche über diese benutzerdefinierten Skripte, nicht den Build-Prozess selbst.
Klaim
1
Ich liebe Maven - das Skript, das zum Erstellen eines "Hell World" C-Programms benötigt wird, ist länger als das Programm!
quant_dev
@quant_dev, ich erinnere mich an das erste Mal, als ich über Maven nachdachte, dass sie auf ihrer eigenen Webseite empfehlen, mit jemandem zu beginnen, der Maven bereits kennt, da es schwierig ist, es beim ersten Mal einzurichten. Das war das erste Zeichen, dass ich überhaupt nichts damit zu tun haben wollte!
Brady
Ich mochte SCons, es ist ein bisschen langsam, aber sehr einfach zu bedienen.
quant_dev
1
@JarrodRoberson Ich habe "Skripte" zu großzügig verwendet. Ich meine seine Konfigurationsdateien. Ich bin nicht sicher, ob deklarativ Maven automatisch portabler und wartungsfreundlicher macht. Es macht es jedoch weniger flexibel, was bei großen Projekten zu Problemen führen kann.
quant_dev
0

Um sich auf die Frage zu konzentrieren:

Ist es sinnvoll, Build-Skripte in C ++ zu schreiben?

Die Antwort ist ein einfaches Nein .

Die aktuell akzeptierte Antwort zoomt in Python und listet eine ganze Reihe gültiger Bedenken auf, aber ich möchte einen sprachunabhängigen Grund hinzufügen:

Sie wirklich nicht wollen Skript etwas in jedem kompilierte Sprache , wenn Sie ihm helfen können:

  • Sie benötigen ein Skript, um das Skript zu booten!
  • Oder Sie müssen das kompilierte Skript in die Quellcodeverwaltung einchecken (und es mit den eingecheckten Quellen synchron halten!)
  • Das Skript enthält plötzlich auch eine Build-Konfiguration für das angehängte Skript. (Das muss gepflegt werden!)

Darüber hinaus gehen mit der anderen Antwort:

Wahrscheinlich möchten Sie auch keine "rohe" Skriptsprache verwenden, um Ihre Build-Skripts zu erstellen (ich verstehe , dass die C ++ - Komplikationen von CMake behandelt werden).

Was Sie wahrscheinlich tun sollten, ist eine der Builds zu wählen . Systeme . raus . dort . und schau ob man deine rechnung wrt passt. Skriptfähigkeit / Erweiterbarkeit / Play-nice-with-CMake / Cross-Plattform.

Martin Ba
quelle