ant+cpptasks vs. scons vs. make

Szukam scons i chcę się upewnić, że wiem, jakie są alternatywy, zanim zainwestuję kawałek komórek mózgowych w coś zupełnie innego. Używałem GNU make w przeszłości, ale nigdy nie byłem z niego szczególnie zadowolony.

Szczególnie: dlaczego Ant nie jest częściej używany w projektach C / C++? (biorąc pod uwagę, że jest Ant cpptasks) przeczytałem kilka postów, które mówią, że Ant jest bardziej zorientowany na Javę (oczywiście), ale jaka jest wada do tak? I dlaczego bułeczki są o wiele lepsze od makaronu?

Pracuję z cross-kompilatorem dla TI DSP, zazwyczaj w projekcie jest 20-50 plików cpp. Wydaje się, że trudną częścią w zarządzaniu kompilacją jest automatyczne sprawdzanie zależności. Wszystko inne to tylko mapowanie list plików wraz z zestawami opcji kompilatora.

Edit: A dlaczego cross-compilation coś zmienia? jest to kompilator, który działa tak samo jak GCC, tylko że produkuje pliki obiektowe / pliki wykonywalne, które nie będą działać na moim komputerze.

Author: Jason S, 2009-06-23

5 answers

Do kompilacji krzyżowej myślę, że najlepszym wyborem są CMake lub Autotools . Zwłaszcza jeśli możesz skompilować swój kod dla wielu architektur / platform. Zazwyczaj kompiluję podzbiór mojego kodu na natywnej maszynie do celów testowania jednostkowego, a wszystko to dla docelowej platformy. CMake radzi sobie z tym szczególnie dobrze, ponieważ pozwala określić, gdzie mieszkają skompilowane biblioteki. Więc zamiast szukać skompilowanego libpng w /usr/lib, można go poszukaj w /opt/ arm-eabi-gcc / lub gdziekolwiek masz biblioteki łańcuchów narzędzi zainstalowane na maszynie kompilacyjnej. Możesz utworzyć wiele katalogów kompilacji dla różnych wariantów i ręcznie skompilować każdy wariant za pomocą make, lub wyzwalać wiele za pomocą ręcznie zwijanego rekurencyjnego make.

Ant ma wadę, że jest w zasadzie tak dobry lub tak zły, jak vanilla Make, z dodatkową wadą, że używasz czegoś, co nie jest szczególnie popularne w C lub c++. Musisz sobie z tym poradzić. ze wszystkimi własnymi zależnościami - zarówno wewnętrznymi, takimi jak plik C do pliku nagłówkowego do biblioteki lub pliku wykonywalnego, jak i zewnętrznymi zależnościami, takimi jak połączenie z bibliotekami innych firm. Poza tym nie sądzę, aby zadania Ant C były tak bardzo utrzymywane. Wszyscy, których widziałem, którzy używają Ant dla C, wołają do GCC z zadaniami exec.

SCons jest lepszy, ale kompilowanie krzyżowe nie jest jego mocną stroną. Nie jest to "build system" jak CMake lub Autotools albo, to tylko budować narzędzie. Jak pisze na ich wiki, jest to prawie "Make in Python". Ma wbudowaną obsługę zależności, co oznacza, że nie musisz obracać własnych za pomocą "gcc-MM-MD" lub czegokolwiek, więc jest to przewaga nad marką. SCons ma również wsparcie dla wykrywania zainstalowanych bibliotek innych firm, ale sposób, w jaki jest to zwykle robione, może znacznie wydłużyć czas kompilacji. W przeciwieństwie do innych systemów, SCons uruchamia etap sprawdzania za każdym razem, gdy go uruchamiasz, chociaż większość wyników jest buforowana. SCons jest również niesławny ze względu na długi czas kompilacji, chociaż dla plików 50, które nie byłyby problemem. Obsługa kompilacji krzyżowej w SCons nie istnieje - musisz zwijać własną , jak zostało to omówione w tym wątku na liście dyskusyjnej. Zazwyczaj wymusza się kompilację podobną do platformy Unix, a następnie nadpisuje nazwę kompilatora C. Budowanie wielu wariantów lub oddzielanie katalogu build Od katalogu źródłowego jest pełne gotchas, co czyni go mniej odpowiednim, jeśli przekroczysz i natywnie-skompiluj swój kod.

CMake i Autotools mają problemy z zależnościami rozwiązane dość dobrze, a obsługa kompilacji krzyżowej autotools jest dojrzała. CMake ma kompilację krzyżową od wersji 2.6.0, która została wydana w kwietniu 2008. Dostajesz te funkcje za darmo, a także inne, takie jak pakowanie i uruchamianie testów jednostkowych ("Sprawdź" lub podobne cele). Minusem obu tych narzędzi jest to, że wymagają bootstrappingu. W przypadku CMake, musisz mieć plik binarny CMake zainstalowany do tworzenia plików Makefiles lub Visual Studio solution. W przypadku Autotools jest to nieco bardziej skomplikowane, ponieważ nie wszyscy kompilujący oprogramowanie potrzebowaliby zainstalowanych automake i autoconf, tylko ci, którzy muszą zmienić system budowania (dodawanie nowych plików liczy się jako zmiana systemu budowania). 2 ETAP bootstrapping (configure.ac - > Konfiguracja, Konfiguracja + Makefile.in - > Makefile) jest koncepcyjnie nieco trudniejsze do zrozumienia.

Do edycji: Zestawienie krzyżowe jest dodatkowym bólem głowy w systemach budowania z tego powodu, że zwiększa złożoność automatycznego wykrywania programów i bibliotek. SCons nie radzi sobie z tym problemem, pozostawia to do ciebie, aby rozwiązać ten problem. Ant podobnie nic nie robi. Autoconf obsługuje to w przypadku autotools, ale być może będziesz musiał podać "--with-libfoobar= / some / path " w wierszu poleceń podczas konfigurowania lub face broken linking, gdy próbuje użyć /usr / lib w fazie łącza. Podejście CMake ' a jest nieco cięższe z plik toolchain, ale oznacza to, że nie musisz określać wszystkich narzędzi i bibliotek (CC, CXX, RANLIB, -- with-ibfoo=, itd.), ponieważ są one zorientowane w standardowej konwencji. Teoretycznie można ponownie użyć odpowiednio spreparowanego pliku CMake toolchain w wielu projektach, aby je skompilować. W praktyce CMake nie jest na tyle rozpowszechniony, aby uczynić go wygodnym dla przeciętnego hakera, chociaż może być przydatny, jeśli tworzysz wiele prawnie zastrzeżonych projektów.

 25
Author: richq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 20:21:42

Używałem Ant + CppTasks mocno kilka lat temu do budowania bardzo dużych baz kodu zintegrowanych z nowym kodem Java poprzez JNI i byłem bardzo zadowolony z wyników bardzo niezawodnych przyrostowych kompilacji kodu C++, dobrej elastyczności (w plikach kompilacji lub poprzez poprawki do kodu). Ale CppTasks jest projektem bez społeczności, a opiekun (Curt Arnold) od dawna nic z nim nie robił. Pozostaje bardzo dobry i przydatny, ale należy pamiętać, że bardzo niewiele osób zna lub używa CppTasks (sposób, w jaki Kompilatory "licytują" pliki gryzą mnie na przykład, gdy potrzebowałem konkretnego kompilatora dla plików C, a inny kompilator C++ odbierał je zamiast tego).

Sposób, w jaki CppTasks śledzi opcje kompilacji i dynamicznie skanuje źródła w poszukiwaniu zależności nagłówka, przez cały czas, ale wystarczająco szybko( jest trochę buforowania zależności), oznaczał, że jedyny system, z którym pracowałem, miał dokładne przyrostowe Kompilacje, coś bardzo ważnego podczas budowania bardzo dużego kodu bazy.

Więc jak już mówiłem kilka razy na listach Ant user/dev, jeśli masz dużo rzeczy Java i już zainwestowałeś w Ant, i nie boisz się zanurzyć w DOC i kod CppTasks, a teraz musisz zbudować kod JNI "glue" i/lub "legacy" natywne biblioteki, które kod glue eksponuje, jest to wartościowa rywalizacja, a nagrody mogą być świetne.

I łatwo zintegrować Dla dll Windows, aby dodać pełną wersję informacji, na przykład, pisząc little Ant zadanie do formatowania .plik res poprawnie. U mnie działało, ale Ant + CppTasks jest zdecydowanie bardziej dla "zaawansowanego" użytkownika / dewelopera Ant IMHO.

Mam nadzieję, że to pomoże. -- DD

 6
Author: ddevienne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 17:26:20

Chciałbym polecić terp do budowania projektów C++ z ANT. Stworzyliśmy terp, ponieważ ANT jest naszym wybranym narzędziem do budowania, a zadania Cppt były coraz dłuższe w zębie i dlatego, że chcieliśmy pracować na innym poziomie abstrakcji. terp obsługuje wiele różnych kompilatorów i jest obsługiwany przez naszą firmę. W przypadku większości projektów nie jest to jednak bezpłatne.

Zaprojektowaliśmy terp głównie dla pełnych przebudów, a nie przyrostowych kompilacji z analizą zależności. Jesteśmy dojazd, ale jeszcze go nie ma. Sweet spot dla terp jest w wydaniach wieloplatformowych, multi-procarch, multi-kompilatorów, gdzie nie chcesz utrzymywać n różnych konfiguracji dla wszystkich kombinacji. W tym momencie (lipiec ' 09) jest w publicznej wersji beta, ale wkrótce zostanie wydany.

 3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 19:08:40

Pracowałem nad projektem przez ostatnie pięć lat, który tworzy x86 i ARM przy użyciu ant. Poprawiliśmy cpptasks do naszych celów, aby stworzyć ogólny kompilator, który po prostu przekazujemy w prefiksie do...np. arm-gum-linux-gnueabi - a potem to zostaje dodane do rzeczywistego narzędzia np. g++ czy ar czy jakoś tak. Brak prefiksu oznacza, że dostajesz narzędzia do budowania platform programistycznych. Łańcuchy narzędzi do kompilacji krzyżowej mają te prefiksy w swoich binariach narzędzi budowania. Prawie cały powód do pójścia z Ant a nie cokolwiek make oparte było cpptasks zdolność do robienia inremental buildy i uttter plątaniny rzeczy, które muszą się zdarzyć, aby utrzymać autoconf szczęśliwy. Jesteśmy w stanie wspierać paradygmat, że prawie każdy plik źródłowy, szczególnie te w strukturze drzewa folderów dla zestawu bibliotek, może być utworzony/przemianowany/usunięty i nie ma potrzeby wprowadzania zmian do plików kompilacji. Jedną małą wadą jest to, że łączenie plików aktualizuje właściwości w sposób, który spowoduje niepotrzebną przebudowę.

<target name="lib.cvp">
<fetch.and.log.version 
    svnvers.target="common/cvp" 
    svnvers.property="libcvp.version"/>
    <cc objdir="${obj.dir}/common/cvp" 
        commandPrefix="${command.prefix}" 
        compilerName="${compiler.name}"
        outfile="${lib.dir}/cvp" outtype="static">
        <compiler extends="base.compiler"/>
        <compilerarg 
            value="-D__CVP_LIB_BUILD_VERSION__=&quot;${libcvp.version}&quot;"/>
        <compilerarg 
            value="-D__BUILD_NOTES__=&quot;${libcvp.toolversion}&quot;"/>
        <compilerarg if="is.x86" value="-DARCH_X86"/>
        <linker extends="base.linker"/>
        <includepath refid="common.inc"/>
        <fileset dir="${project.home}/common/cvp">
            <include name="*.c"/>
            <include name="*.cpp"/>
        </fileset>
    </cc>
</target>
 2
Author: tshock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-23 06:04:17

Ant ma bardzo dużą bazę użytkowników Javy (z przyczyn naturalnych). Fakt, że Ant może być bardzo przydatny w znacznie szerszym otoczeniu, jest czymś, czego większość programistów spoza Javy nie jest świadoma. W rezultacie, jeśli używasz Ant zbudować swój C / C++-kod znacznie więcej na własną rękę, że jeśli używasz systemu z większą bazą użytkowników (CMake lub SCons).

Osobiście byłem bardzo zadowolony z CMake, przede wszystkim dlatego, że jest to jedyny system budowania, który może generować prawdziwe Projekty Visual Studio. Bułeczki też mogą, ale wykonują tylko zewnętrzne wywołanie do SCons, podczas gdy CMake generuje projekty, które wykorzystują własny silnik budowania Visual Studio. Jest to bardzo przydatne, jeśli pracujesz razem z ludźmi, którzy są przyzwyczajeni do Visual Studio.

Nie jestem pewien, czy nazwałbym wsparcie CMake dla crosscompilation "dojrzałym", ponieważ wciąż jest dość młody. Ale ludzie z CMake traktują to poważnie, więc nie wahałbym się go wypróbować.

 1
Author: JesperE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 10:15:15