2012-05-14 8 views
5

Ich frage mich, wie ich ein wachsendes C++ Projekt verwalten sollte. Jetzt entwickle ich ein Projekt mit Netbeans und es ist schmutzige Arbeit, Makefiles zu erzeugen. Das Projekt ist zu groß geworden und ich habe beschlossen, es in ein paar Teile aufzuteilen. Was ist der beste Weg, dies zu tun?Wie man wachsendes C++ Projekt verwaltet

Ich versuche Scons als mein Build-System zu verwenden. Ich hatte Erfolg damit, aber sollte ich die Build-Skripte jedes Mal bearbeiten, wenn ich Dateien anfüge oder lösche. Es ist zu langweilig.

Also ich brauche deinen Rat.

P.S. Übrigens, wie macht ein großes Projekt wie Google Chrome das? Verwendet jeder eine Art IDE, um Skripte zu erstellen, die nur für die Softwareverteilung erstellt wurden?

+0

In vielen Unternehmen gibt es eine dedizierte Position namens "Buildmeister". Es ist die Aufgabe dieser Leute, die Build-Umgebung zu erhalten und vielleicht sogar Unit-Tests. – Mikhail

+0

@Misha, diese Verantwortung wird oft als Configuration Manager bezeichnet. – Brady

+0

@Misha und was ist mit Workflow? Ist es ein richtiger Weg, um jedem Entwickler Code in der bevorzugten IDE schreiben zu lassen, und Buildmeister wird ihre Projekte in einen Build umwandeln? –

Antwort

4

Ich benutze auch Netbeans für C++ und kompiliere mit SCons. Ich benutze das jVi Netbeans Plugin, das wirklich gut funktioniert.

Aus irgendeinem Grund ist das Netbeans Python-Plugin nicht mehr offiziell, was ich überhaupt nicht verstehe. Sie können es immer noch bekommen, und es macht wirklich die Bearbeitung der SCons Skripte zu einem schönen Erlebnis. Obwohl Netbeans noch kein SCons-Plugin hat (noch?), Können Sie den Build-Befehl zum Ausführen von SCons konfigurieren.

Wie für die Wartung der SCons Skripte automatisch von der IDE, ich tue das auch nicht, ich mache das von Hand.Aber es ist nicht so, dass ich täglich damit zu tun habe, also sehe ich nicht, dass es so wichtig ist, besonders wenn man bedenkt, wie einfach es ist, die Skripte zu lesen.

Hier ist das Build-Skript in SCons, die das gleiche tut wie für CMake zuvor erwähnt:

env = Environment() 
env.EnsurePythonVersion(2, 5) 
env.EnsureSConsVersion(2, 1) 

libTarget = env.SharedLibrary(target = 'foo', source = ['a.cpp', 'b.cpp', 'c.pp']) 
env.Program(target = 'bar', source = ['bar.cpp', libTarget]) 

Die SCons Glob() -Funktion ist eine nette Option, aber ich neige weg automatisch Gebäude alle von zurückzuschrecken die Dateien in einem Verzeichnis. Das Gleiche gilt für die Auflistung von zu erstellenden Unterverzeichnissen. Ich bin oft genug gebrannt worden und ziehe es vor, die zu erstellenden Dateien/Verzeichnisse explizit anzugeben. Wenn Sie diese Gerüchte hören, dass SCons langsamer als andere Alternativen ist, hat die SCons GoFastButton einige Hinweise, die helfen können.

+0

Es ist traurig, aber Netbeans haben wirklich noch keine SCON Unterstützung. Aber sr42 gab eine gute Idee, Glob() zu verwenden. Ich denke, das ist es was ich wirklich mache. Übrigens, warum bevorzugen Sie eine explizite Angabe? –

+0

@AlexPovar, Es ist weniger üblich mit Quelldateien, aber mit Unterverzeichnissen Ich habe oft mehrere Versionen eines Verzeichnisses (z. B. subdirA und subdirA.old) und wenn beide kompiliert werden, könnten Sie Konflikte oder unerwartetes Laufzeitverhalten, das ist nicht leicht zu bekommen debuggen, da ich annahm, dass es nur bestimmte Verzeichnisse kompiliert. Ähnliches kann bei Quelldateien passieren. Wenn Sie neue Quelldateien hinzufügen, müssen Sie daran erinnern, dass sie dem Erstellungssystem *** und der *** Quellcodeverwaltung hinzugefügt werden müssen. – Brady

+0

Verwenden Sie ein Zwischen-Makefile für den Aufruf von Scons aus Netbeans? –

4

Die meisten großen Projekte bleiben bei einem Build-System, das automatisch alle unordentlichen Details für sie verarbeitet. Ich bin ein großer Fan von CMake (das ist, was KDE für alle ihre Komponenten verwendet), aber Scons ist eine weitere beliebte Wahl. Mein Editor (KDevelop) behandelt angeblich CMake-Projekte selbst, aber ich bearbeite die Build-Skripte selbst, weil es nicht so schwer ist.

Ich würde empfehlen, ein Werkzeug wirklich gut zu lernen und dabei zu bleiben (es gibt genügend Dokumentation für jedes Werkzeug, das Sie interessieren wird). Stellen Sie sicher, dass Sie auch in Versionskontrolle schauen, wenn Sie nicht bereits haben (Ich habe eine Schwäche für Git, aber Mercurial und Subversion sind auch sehr beliebte Möglichkeiten).


Ein einfaches CMake Beispiel:

project("My Awesome Project" CXX) 
cmake_minimum_required(VERSION 2.8) 
add_library(foo SHARED a.cpp b.cpp c.cpp) #we'll build an so file 
add_executable(bar bar.cpp) 
target_link_libraries(bar foo) #link bar to foo 

Dies ist offensichtlich ein trivialer Fall, aber es ist sehr einfach nach Bedarf zu verwalten und zu erweitern.

+0

Ja, das Verwalten von Build-Skripten von Hand ist nicht schwer, aber es ist ziemlich einfach, etwas hinzuzufügen. Momentan gibt es zwei Build-Systeme im Projekt. Makefiles sind nativ für Netbeans, aber es ist schwer für mich, es zu verwalten und Scons, die einfach zu benutzen sind, aber keine IDE-Integration haben. Übrigens: Entwickeln KDevelop-Projekte auf CMake? Und ja, ich benutze mercurial als DCVS. –

+0

KDevelop wird auch mit CMake erstellt und kann die Projektdateien für Sie verwalten. Wie ich schon sagte, ich habe es mir nie überlassen, aber ich werde meine Antwort mit einem einfachen CMake-Beispiel aktualisieren, damit Sie sehen können, wie einfach es ist. –

+0

CMake ist in Ordnung, sein Hauptproblem ist seine Syntax (die ich immer nicht intuitiv fand). Sie können etwas wie SCons oder Waf nicht schlagen, die Python benutzen, eine wahre Programmiersprache. Es sollte genauso einfach (wenn nicht einfacher) sein, Dateien wie in CMake zu pflegen. – Brady

2

Ich versuche, Scons als Build-System zu verwenden. Ich habe etwas Erfolg damit, aber ich sollte Build-Skripte jedes Mal, wenn ich Datei anhängen oder löschen. Es ist zu langweilig.

Je nachdem, wie Sie Ihre Dateien organisiert sind, können Sie zum Beispiel die Scon Glob() Funktion Quelldateien als Liste zu erhalten, ohne alle Dateien einzeln aufzulisten sind. Um zum Beispiel alle C++ Quelldateien in eine ausführbare Datei zu erstellen, können Sie tun:

Program('program', Glob('*.cpp')) 

Sie können das gleiche in CMake mit seiner Befehle tun.

Und, wenn Sie SCons verwenden, da es Python ist, können Sie beliebigen Python-Code schreiben, um Ihre Quelldateilisten zu erstellen.

Sie können auch Dateien in mehrere Ordner organisieren und zusätzliche SCons (oder CMakeList.txt) Dateien erstellen, die das Master-Build-Skript aufrufen kann.

+0

Klingt gut. Ich habe eine Java-ähnliche Projektorganisation mit Paketen. Es scheint recht gut zu sein, mit Verzeichnissen anstatt mit Quellen zu arbeiten. –