2012-05-14 17 views
5

Zastanawiam się, jak powinienem zarządzać rozwijającym się projektem C++. Teraz tworzę projekt z Netbeans i jego brudną robotą generującą pliki makefile. Projekt stał się zbyt duży i postanowiłem podzielić go na kilka części. Jaki jest najlepszy sposób na zrobienie tego?Jak zarządzać rosnącym projektem C++

Próbuję użyć Scons jako mojego systemu kompilacji. Odniosłem z tym pewien sukces, ale powinienem edytować skrypty budujące za każdym razem, gdy dołączam lub usuwam pliki. To zbyt nudne.

Potrzebuję twojej porady.

P.S. A tak przy okazji, jak robi to duży projekt, taki jak Google Chrome? Czy każdy używa jakiegoś IDE do budowania skryptów generowanych wyłącznie w celu dystrybucji oprogramowania?

+0

W wielu firmach istnieje dedykowane stanowisko o nazwie "Buildmeister". Zadaniem tych ludzi jest utrzymanie środowiska budowy, a może nawet testów jednostkowych. – Mikhail

+0

@Misha, ta odpowiedzialność jest często nazywana menedżerem konfiguracji. – Brady

+0

@Misha a co z przepływem pracy? Czy jest to właściwy sposób na umożliwienie każdemu programistycznemu pisaniu kodu w preferowanym IDE, a Buildmeister zamieni swoje projekty w jedną kompilację? –

Odpowiedz

4

Używam również Netbeans dla C++ i kompiluję z SCons. Używam wtyczki jVi Netbeans, która naprawdę działa dobrze.

Z jakiegoś powodu wtyczka Netbeans Python nie jest już oficjalna, czego w ogóle nie rozumiem. Nadal możesz go uzyskać i naprawdę sprawia, że ​​edytowanie skryptów budowania SCons jest miłym doświadczeniem. Nawet jeśli Netbeans nie ma wtyczki SCons (jeszcze?), Nadal możesz skonfigurować jego polecenie budowania, aby uruchomić SCons.

Jeśli chodzi o utrzymywanie skryptów SCons automatycznie przez IDE, ja też tego nie robię, robię to ręcznie.Ale nie jest tak, że muszę sobie z tym poradzić codziennie, więc nie widzę, żeby to było ważne, zwłaszcza biorąc pod uwagę, jak łatwo jest odczytać skrypty.

Oto skrypt kompilacji w SCons że działa tak samo jak wymienione wcześniej dla CMake:

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]) 

Funkcja SCons Glob() jest to dobra metoda, ale staram się uciekać od automatycznie budynek wszystko pliki w katalogu. To samo dotyczy zestawienia podkatalogów do zbudowania. Zostałem przez to spalony wystarczająco dużo razy i wolę jawnie określać plik/katalogi do zbudowania.

Jeśli usłyszysz te pogłoski, że SCons jest wolniejszy niż inne alternatywy, SCons GoFastButton ma kilka wskazówek, które mogą pomóc.

+0

To smutne, ale Netbeans naprawdę nie ma jeszcze wsparcia dla SCON. Ale sr42 dał dobry pomysł, aby użyć Glob(). Myślę, że to jest to, co naprawdę skłamie. BTW, dlaczego preferujesz wyraźne określanie? –

+0

@AlexPovar, jest mniej popularny z plikami źródłowymi, ale z podkatalogami często mam wiele wersji katalogu (na przykład subdirA i subdirA.old) i jeśli oba zostaną skompilowane, może pojawić się konflikt lub nieoczekiwane zachowanie środowiska wykonawczego, które nie jest łatwe debugowania, ponieważ zakładam, że kompiluje tylko niektóre katalogi. Coś podobnego może się zdarzyć z plikami źródłowymi. Ponadto przy dodawaniu nowych plików źródłowych należy pamiętać, że należy je dodać do systemu zarządzania *** i *** kontrolą źródła. – Brady

+0

używasz pliku pośredniego makefile do wywoływania sconów z Netbeans? –

4

Większość dużych projektów zawiera system kompilacji, który automatycznie obsługuje wszystkie niepotrzebne szczegóły. Jestem wielkim fanem CMake (którego używa KDE dla wszystkich swoich komponentów), ale scons jest kolejnym popularnym wyborem. Mój redaktor (KDevelop) podobno sam obsługuje projekty CMake, ale sam edytuję skrypty, ponieważ nie jest to takie trudne.

Polecam naukę jednego narzędzia naprawdę dobrze i trzymanie się go (mnóstwo dokumentacji jest dostępne dla każdego narzędzia, które Cię interesuje). Upewnij się, że zajrzysz również do kontroli wersji, jeśli jeszcze tego nie zrobiłeś (mam słabość do git, ale Mercurial i Subversion są również bardzo popularnymi wyborami).


prosty przykład CMake:

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 

Jest to oczywiście banalna sprawa, ale to jest bardzo łatwe do zarządzania i rozszerzać w miarę potrzeb.

+0

Tak, zarządzający budować skrypty ręcznie nie jest trudne, ale jest to raczej proste zapomnieć coś dodać. Obecnie w projekcie są dwa systemy kompilacji. Pliki Makefile są rodzime dla Netbeans, ale trudno mi nimi zarządzać, a Scons jest łatwy w użyciu, ale nie ma integracji z IDE. Przy okazji, czy projekty KDevelop są zbudowane na CMake? I tak, używam rtęci jako DCVS. –

+0

KDevelop jest również zbudowany przy użyciu CMake i może przechowywać pliki projektu dla ciebie. Jak już wspomniałem, nigdy nie pozwoliłem, aby zarządzało mną dla mnie, ale zaktualizuję swoją odpowiedź za pomocą prostego przykładu CMake, abyś mógł zobaczyć, jakie to proste. –

+0

CMake jest w porządku, jego głównym problemem jest jego składnia (co zawsze uważałem za mało intuicyjne). Nie możesz pokonać czegoś takiego jak SCons lub Waf, które używają Pythona, prawdziwego języka programowania. Powinno być równie łatwe (jeśli nie łatwiejsze) zachowanie plików SCons jak w CMake. – Brady

2

Próbuję użyć Scons jako systemu kompilacji. Mam z tym pewien sukces, ale powinienem edytować skrypty budowania za każdym razem, gdy dołączam lub usuwam plik. To zbyt nudne.

zależności od tego jak pliki są zorganizowane, można użyć, na przykład, Glob() funkcję scon, aby uzyskać pliki źródłowe w postaci listy bez konieczności wymienić wszystkie pliki indywidualnie. Na przykład, aby zbudować wszystkie pliki źródłowe C++ do pliku wykonywalnego, można zrobić:

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

Można zrobić to samo w CMake pomocą jego poleceń.

Jeśli używasz SCons, ponieważ jest to Python, możesz napisać dowolny kod w Pythonie, aby utworzyć listę plików źródłowych.

Można również organizować pliki w wielu folderach i mieć pliki SCONS (lub CMakeList.txt) zależne od budowanego skryptu głównego.

+0

Brzmi nieźle. Mam pakiet projektów w stylu Java z pakietami. Wydaje się, że całkiem dobrze jest pracować z katalogami zamiast źródłami. –

Powiązane problemy