C ++ Build Systems - Czego używać? [Zamknięte]

136

Patrzę na rozpoczęcie nowego projektu w C ++ - początkowo tylko w swoim czasie - i badam dostępne systemy kompilacji. Wydawałoby się, że odpowiedź brzmi: „Wiele i wszystkie są okropne”.

Funkcje, których szczególnie potrzebuję, to:

  1. Obsługa C ++ 11
  2. Wieloplatformowy (Linux jako główny cel, ale może również zbudować przynajmniej na Windows)
  3. Przyzwoite wsparcie dla testów jednostkowych
  4. Obsługa wielu modułów do oddzielania kodu
  5. Wsparcie dla generowania kodu (przy użyciu asn1c lub protobuf - jeszcze nie w 100%)
  6. Łatwe w utrzymaniu

Teraz wiem, że mogę z łatwością wykonać 1-4 z tych za pomocą CMake i Autotools. Prawdopodobnie także z SCons i Waf oraz kilkoma innymi. Problem w tym, że nigdy nie wymyśliłem, jak poprawnie generować kod za ich pomocą - czyli pliki źródłowe, które nie istnieją do czasu pierwszego uruchomienia procesu kompilacji, więc pliki źródłowe, które system kompilacji musi być w stanie przekonwertować na kod wykonywalny ale tak naprawdę nie wie o tym do momentu uruchomienia kompilacji ... (w szczególności ASN1C generuje dziesiątki plików nagłówkowych i źródłowych, które muszą być w stanie ze sobą współpracować, a rzeczywisty zestaw generowanych plików zależy od zawartości twojego pliku asn). również fakt, że żadna z nich nie jest szczególnie łatwa w utrzymaniu - CMake i Autotools mają własny, ogromny zestaw skryptów, którymi trzeba zarządzać, aby działały,

Więc - jakie systemy kompilacji są zalecane do czegoś takiego? A może na razie utknę z tworzeniem plików i skryptami powłoki?

Graham
źródło
11
„Wygląda na to, że odpowiedź brzmi:„ Wiele i wszystkie są okropne ”” - takie jest moje wrażenie (z dodatkiem „okropne z mojego punktu widzenia”; nie lubię zbytnio generalizować takich terminów ). Z tego właśnie powodu założyłem własne i wyszło lepiej, niż się spodziewałem, ponieważ robi to, czego chcę i zawsze chciałem, aby wszystko działało. Aby uzyskać coś mniej czasochłonnego, prawdopodobnie będziesz musiał przejrzeć istniejące narzędzia i wybrać takie, które sprawia mniej bólu głowy niż inne.
Christian Stieber
4
Spróbuj tup .
Kerrek SB
zobacz także: stackoverflow.com/q/3349956
ergosys
8
Jakiego rodzaju obsługi C ++ 11 oczekujesz od systemu kompilacji? To jest coś, co dostajesz od kompilatora, system kompilacji nie analizuje ani nawet nie odczytuje rzeczywistych plików źródłowych, po prostu przekazuje je każdemu, kto ich potrzebuje, nie?
Baruch
5
To prawda, ale ułatwienie kompilatorowi użycia obsługi C ++ 11 byłoby dobre. g ++ potrzebuje jednej flagi, clang innego zestawu, msvc najwyraźniej nie potrzebuje żadnej i tak dalej. Ponadto, pomoc w wykrywaniu dostępnych funkcji c ++ 11 byłaby przydatna, ponieważ różni się to również między kompilatorami ...
Graham

Odpowiedzi:

117

+1 za „Wiele i są okropne”.

Jednak „najbogatszym” i „najbardziej skalowalnym” jest prawdopodobnie CMake , który jest generatorem plików Makefile (generuje również natywny MSVC ++ *.proj/ *.sln). Dziwna składnia, ale kiedy już się jej nauczysz, możesz ładnie generować kompilacje dla różnych platform. Gdybym „zaczął od nowa”, prawdopodobnie użyłbym CMake. Powinien obsłużyć twoją listę, chociaż "generowanie kodu" może zająć "własne życie" poza systemem budowania, w zależności od tego, co chcesz zrobić. (Zobacz poniżej.)

W przypadku prostych projektów generator QMake jest w porządku (nie musisz używać bibliotek Qt, aby używać QMake). Ale nie opisujesz „prostego” - generowanie kodu i „dodatkowe fazy” oznacza, że ​​prawdopodobnie potrzebujesz CMakeczegoś z bogatym API dla własnych rozszerzeń, takich jak Scons(lub Waf).

Używamy Sconsów w pracy. Tworzy "kuloodporne kompilacje", ale działa bardzo wolno. Żaden inny system nie będzie tak kuloodporny jak Scons. Ale jest powolny. Jest napisany w Pythonie i rozszerzyliśmy interfejs dla naszej „organizacji przestrzeni roboczej” (gdzie określamy jedynie zależności modułów) i jest to część Sconszałożeń projektowych (ten typ rozszerzenia poprzez Python). Wygodne, ale kompilacje są powolne. Otrzymujesz kuloodporne kompilacje (każde pudełko programisty może wydać ostateczną wersję), ale jest wolne. I jest powolny. Nie zapominaj o tym, jeśli używaszScons , to działa wolno. I jest powolny.

Źle mi się wydaje, że dekadę po 2000 roku nadal nie mamy latających samochodów. Prawdopodobnie będziemy musieli poczekać kolejne sto lat, aby je zdobyć. I wtedy prawdopodobnie wszyscy będziemy latać w naszych latających samochodach, które wciąż są konstruowane z kiepskimi systemami.

Tak, wszystkie są okropne.

[O GENEROWANIU KODU]

Sconsdziała na „fazach” i są one „nieco statyczne”. Potrafi zbudować kod, który jest generowany jako część kompilacji (ludzie robią to na kilka różnych sposobów), ale zostało to opisane jako „coś bardzo nie podobnego do Sconsa”.

Jeśli jest to proste "przetwórz wstępnie niektóre pliki i wygeneruj pliki źródłowe", to nic wielkiego (masz wiele opcji i dlatego qmakezostało napisane - do mocwstępnego przetwarzania*.hpp/*.cpp plików).

Jeśli jednak robisz to w „ciężki sposób”, będziesz musiał napisać własny skrypt. Na przykład mieliśmy skrypty jako część kompilacji, które odpytywały bazy danych i generowały klasy C ++ w celu połączenia między „warstwami” (w tradycyjnym trójwarstwowym tworzeniu aplikacji). Podobnie wygenerowaliśmy kod źródłowy serwera / klienta za pomocą IDL i wbudowanych informacji o wersji, aby umożliwić jednoczesne działanie wielu klientów / serwerów z różnymi wersjami (dla tego samego „klienta” lub „serwera”). Dużo wygenerowanego kodu źródłowego. Moglibyśmy „udawać”, że jest to „system-kompilacji”, ale tak naprawdę jest to nietrywialna infrastruktura do „zarządzania konfiguracją”, której częścią jest „system budowania”. Na przykład ten system musiał „zdjąć” i „

charley
źródło
37
Lubię też Scons - ale myślę, że jest wolny.
Lothar
1
Możesz sprawić, by CMake obsługiwał generowanie kodu za pomocą opakowania Makefile, aby wykonać opcjonalną drugą fazę podczas generowania kodu. Mogłem obsługiwać pełne śledzenie zależności, wczesne wyjście po wygenerowaniu kodu w celu wywołania ponownego cmake itp. Zobacz: javaglue.com/javaglue.html#tag:JavaGlue i code.google.com/p/javaglue
sdw
3
Prawie 2 lata później, czy nadal uważasz, że SCons działa wolno? Kiedy wybierałem system kompilacji, natknąłem się na to i przyczyniło się to do mojej decyzji o przejściu na SCons.
JBentley
2
@ Ben, to prawda, ale jest też powolne.
charley
2
Każdy, kto na to spojrzy, powinien rozważyć Meson (który używa ninja).
Matthew D. Scholefield,
33

Możesz teraz używać Gradle: https://docs.gradle.org/current/userguide/native_software.html

Wydaje się, że to trochę dojrzało przez lata, odkąd to opublikowałem. Strona informująca o „inkubacji projektu” zniknęła, ale nie mogę znaleźć żadnego oficjalnego komunikatu usuwającego ten stan.

Nate Glenn
źródło
Zgodziłbym się z Gradle. Gradle został zaprojektowany tak, aby był skalowalny. Jednak szybkość działania wtyczki zależy od implementacji wtyczki. Jest też trochę narzutów dla samego gradle. Należy również pamiętać, że niektóre wtyczki mogą wymagać dostosowania do przypadków użycia.
JE42,
Ciekawe, że gradle jest zainteresowany obsługą C ++. Mam nadzieję, że stworzą ładny i solidny system budowania projektów C ++, którego wszystkim nam brakuje.
hbobenicio
@squid dzięki, zaktualizowany.
Nate Glenn
1
Gradle jest potężny, ale prosty. Żadnej dziwnej składni, pojedynczy plik gradle.build często wystarcza do zbudowania całego projektu z wieloma wykonywalnymi wyjściami (główne, testy itp.). Brak zrzutu plików do wszystkich katalogów źródłowych. Super przyjazny do wersjonowania.
Overdrivr
1
Spędziłem ostatnie dwa dni walcząc z Gradle, próbując po prostu stworzyć bibliotekę „hello world”, aplikację i gtests, i nie mogę powiedzieć, że mogę go polecić do nowego projektu. Wszystkie narzędzia mogą tam być, ale nie ma dokumentacji (co pozwala na wątpliwości). Może ci z was, którzy uznają to za wykonalne, mogliby wskazać swoje ulubione zasoby?
jwm
16

Znalazłem te, nie wykorzystałem jeszcze osobiście wszystkich:

Ninja , mały system budowania skoncentrowany na szybkości. Google używa teraz Ninja do budowania Androida zamiast Make: link .

Shake , potężny i szybki system budowania.

Tup , system kompilacji o wysokiej wydajności. Projektowanie oparte na algorytmach . Analiza Tup .

Wszystkie są teraz wieloplatformowe i obsługują system Windows. Nie jestem jeszcze pewien co do pozostałych wymagań, ponieważ ponownie nie przetestowałem ich jeszcze osobiście. Są wykorzystywane w rozwoju komercyjnym, CIG wybrał Ninja. Używałem i kocham łatwość i szybkość Ninja z generatorem projektów. Pierwsze dwa są podobne do Scons, Ant itp.

leetNightshade
źródło
1
Tup zepsuje wyszukiwanie symboli, nie gra dobrze z żadnym innym systemem kompilacji (w ogóle), nie gra dobrze z przypadkowymi wyjściami (takimi jak klasy generowane przez javacklasy wewnętrzne, które są podzielone na class$1.classpliki), jest słabo napisany i wykorzystuje hacki systemowe, aby osiągnąć to, co robi. Świetnie nadaje się do małych systemów; nie do utrzymania w przypadku większych projektów.
Qix - MONICA ZOSTAŁA POMYŚLNA
@Qix: Czy nie możesz trzymać danych wyjściowych oddzielnie od repozytorium?
Kerrek SB
1
@KerrekSB Możesz, ale to nie jest problem z wyszukiwaniem symboli. Tup używa FUSE i montuje własne oprogramowanie pośredniczące w .tup/mnt. Następnie uruchamia wszystkie programy kompilacji w folderze (tj. .tup/mnt/@tupjob-XXXXX) Jako katalogu roboczym w celu monitorowania odczytów / zapisów, wymuszając konfigurację kompilacji. Działa dobrze, chyba że ścieżka jest zapisana absolutnie (tj. Z symbolami). Podczas kompilowania pliku binarnego ścieżka symbolu jest przechowywana w samym pliku binarnym. Oznacza to, że gdy GDB próbuje załadować symbole, szuka tupjobścieżki, która nie istnieje, powodując błędy.
Qix - MONICA ZOSTAŁA POMYŚLNA
Zarówno Tup, jak i Ninja są narzędziami bardzo niskiego poziomu, tak niskim lub nawet niższym niż Make. Nie są dostosowane do C ++. Nie nazwałbym nawet tych narzędzi samodzielnym budowaniem systemów, ponieważ brakuje im wielu ważnych funkcji wyższego poziomu, które oferują prawdziwe systemy kompilacji do obsługi złożonych projektów w świecie rzeczywistym. Niektóre z tych systemów mogą używać Ninja jako zaplecza.
Johan Boulé
11

Scons to bardzo przyjazny i elastyczny system, ale masz rację, Lothar, działa bardzo wolno.

Istnieje jednak sposób na zwiększenie wydajności programów napisanych w Pythonie. Takie wykorzystanie JIT. Ze wszystkich znanych projektów, PyPy jest bardzo potężną, szybko rozwijającą się i zmotywowaną implementacją Pythona 2.7, opartą na JIT. Kompatybilność PyPy z Pythonem 2.7 jest po prostu niesamowita. Jednak Scons zadeklarowany jako nieobsługiwany projekt na wiki zgodności PyPy . Z drugiej strony Waf , modelowany jako następca autotools oparty na Pythonie, jest w pełni obsługiwany przez infrastrukturę PyPy. W moich projektach szybkość montażu wzrosła 5-7 razy w przejściu na PyPy. Możesz zobaczyć raporty wydajności z PyPy .

W przypadku nowoczesnego i stosunkowo szybkiego systemu Waf jest dobrym wyborem.

aegor
źródło
Warto zauważyć, że scons jest teraz oznaczony jako „Zgodny” na połączonej stronie wiki, więc najwyraźniej działa teraz z PyPy.
Fałszywe nazwisko
8

System kompilacji Google to dobra alternatywa: http://bazel.io/

Mike B.
źródło
3
„Wieloplatformowy (Linux jako główny cel, ale może również budować przynajmniej na Windows)”. W FAQ firmy Bazel czytamy: „Obecnie aktywnie pracujemy nad ulepszeniem obsługi systemu Windows, ale wciąż nie można tego używać”.
Michael Mrozek
3
Nie jestem pewien, czy to sam system, czy facet, który skonfigurował projekt, ale miałem duży ból w plecach, używając go @ work. Jest bardzo nieelastyczny (w tym sensie, że obsługuje tylko jeden sposób robienia rzeczy, często nieoptymalny, jeśli nie przerażający), niewystarczająco potężny, słabo udokumentowany (poza podstawowymi przypadkami), ma małą społeczność, więc nie oczekuj, że przepełnienie stosu przyjdzie cię uratować , sama w sobie dość zależna, nie działa dobrze z większością IDE na większości systemów itp., itd., itd. Więc jeśli nie jesteś fanem google - trzymaj się z daleka od tego (przy okazji jest to facebookowa wersja o nazwie Buck - dla fanów facebooka)
Slava
Hej, stwierdziłem, że jest naprawdę łatwy w użyciu po spędzeniu 6 tygodni na próbach uruchomienia CMake. Chciałem, aby pobierał zależności innych firm i je kompilował (ponieważ byłem przyzwyczajony do ładnych narzędzi do budowania z Pythona i JavaScript). Ułatwiło to, ale ma tę wadę, że być może będziesz musiał napisać własne pliki bazela dla stron trzecich, które go nie obsługują. Potrzebują centralnego repozytorium, aby je przechowywać.
CpILL
6

Użyłem SCons i jestem pod wrażeniem tego systemu kompilacji. SCons jest rozszerzalny przez Pythona i sam Python - jest świetny, ponieważ Python ma wszystko, czego potrzebujesz, po prostu zakoduj logikę, cała funkcjonalność niskiego poziomu jest już zaimplementowana w SCons i Pythonie i jest wieloplatformowa. Jeśli masz dobre umiejętności programistyczne, twoje skrypty budujące będą wyglądać idealnie i łatwo.

Make, CMake i podobne systemy kompilacji wyglądają jak śmieć makr. Waf jest analogiem SCons. Próbuję Waf, ale SCons będzie bardziej przyjazny, więc zostałem z SCons.

Według opinii tłumu SCons jest zbyt wolny, ale w środku projektu nie widziałem żadnej różnicy między marką a SCons pod względem szybkości kompilacji. Zamiast tego SCons dobrze działał z równoległymi kompilacjami, podczas gdy make ma z tym duże problemy.

Ponadto SCons umożliwia pobieranie - konfigurowanie, budowanie, wdrażanie, generowanie konfiguracji z szablonów, uruchamianie testów i wykonywanie wszelkich innych zadań, które można wykonać, np. Kodowanie w Pythonie i SCons - wszystko w jednym. To bardzo duża zaleta.

W przypadku prostego projektu CMake to również dobry wybór.

Torsten
źródło
3
Mój problem polega na tym, że jestem zepsuty. Z zawodu jestem programistą Java, a narzędzia takie jak Gradle w świecie Javy to narzędzia, które naprawdę chciałbym mieć do programowania w C ++. Mogę skonfigurować projekt gradle bez zewnętrznych zależności, używając jednego wiersza pliku kompilacji. Otóż ​​to. Projekty wielomodułowe, które mają wiele zależności, są również łatwe do wykonania i faktycznie ważą przy znacznie mniejszej konfiguracji niż nawet prosty projekt C ++ ...
Graham
Miałem problemy z budowaniem innych pakietów, które używają Scons, ponieważ nie są to abstrakcyjne flagi konfiguracji systemu, takie jak -I include dirs i -L bibliotek dirs. Nie zajmie to CFLAGS, często musisz zmodyfikować każdy skrypt scons, aby wyglądał we właściwym miejscu.
ACyclic
5

żeby dodać moje centy: premake

http://industriousone.com/premake

na wiki znajduje się również dedykowana strona internetowa .

user827992
źródło
2
Niestety Premake nie obsługuje generowania kodu zgodnie z wymaganiami OP. I nie nazwałbym jego wsparcia dla testów jednostkowych „przyzwoitym”, chociaż jest kilka rzeczy, które możesz zrobić.
ergosys
@ergosys zauważyłem, że ant nie jest wymieniony, antobsługuje również C / C ++, zobacz, czy to jest dobre dla Ciebie, to moje nazwisko, po prostu używam do tego Makefiles i Cmake.
user827992
2

Możesz użyć Ceedling . Należy jednak pamiętać, że obecnie obsługuje on tylko C i jest ściśle powiązany z autorskimi frameworkami testowymi Unity i CMock.

Można go dość łatwo rozwidlać i modyfikować, aby działał z kompilatorem C ++ i frameworkiem testowania jednostkowego / symulowania.

Również Tup jest godne wzmianki. Jest niezwykle szybki, ale nic nie wie o testowaniu frameworków itp., Co oznacza, że ​​będziesz musiał napisać własny system kompilacji za pomocą Tup. Jeśli planujesz robić TDD, prawdopodobnie najlepszym rozwiązaniem jest Tup.

thegreendroid
źródło