ant + cpptasks vs. scons vs. make - PullRequest
       41

ant + cpptasks vs. scons vs. make

20 голосов
/ 23 июня 2009

Я изучаю scons , и я просто хочу убедиться, что знаю, какие есть альтернативы, прежде чем вкладывать кусок клеток мозга в нечто совершенно иное. Я использовал GNU make в прошлом, но никогда не был особенно доволен этим.

В частности: почему Ant не используется чаще в проектах C / C ++? (учитывая, что есть ant cpptasks ) Я прочитал несколько постов, в которых говорится, что Ant больше ориентирован на Java (очевидно), но какой недостаток в этом? И почему сыновья намного лучше, чем делают?

Я работаю с кросс-компилятором для TI DSP, обычно в проекте 20-50 файлов cpp. Казалось бы, сложная часть управления сборкой - автоматическая проверка зависимостей. Все остальное - это просто отображение списков файлов вместе с наборами параметров компилятора.

edit: и почему кросс-компиляция что-то меняет? это компилятор, который запускается так же, как и gcc, только потому, что он создает объектные файлы / исполняемые файлы, которые не запускаются на моем ПК.

Ответы [ 5 ]

25 голосов
/ 24 июня 2009

Для кросс-компиляции я думаю, что ваш лучший выбор: CMake или Autotools . Особенно, если вы можете скомпилировать свой код для нескольких архитектур / платформ. Обычно я собираю подмножество своего кода на собственной машине для целей модульного тестирования и все это для целевой платформы. CMake справляется с этим особенно хорошо, поскольку позволяет указать, где находятся кросс-скомпилированные библиотеки. Поэтому вместо поиска кросс-скомпилированной библиотеки libpng в / usr / lib можно посоветовать искать в / opt / arm-eabi-gcc / или там, где на вашей машине сборки установлены библиотеки цепочек инструментов. Вы можете создать несколько каталогов сборки для разных вариантов и вручную скомпилировать каждый вариант с помощью make или запустить серию с помощью рекурсивного make, созданного вручную.

У Ant есть недостаток, заключающийся в том, что он в основном такой же или плохой, как vanilla Make, с дополнительным недостатком в том, что вы используете что-то, что не особенно распространено для C или C ++. Вы должны иметь дело со всеми вашими собственными зависимостями - как внутренними, такими как C-файл в файл заголовка для библиотеки или исполняемого файла, так и внешними зависимостями, такими как необходимость связи со сторонними библиотеками. Кроме того, я не думаю, что задачи Ant C действительно так сильно поддерживаются. Все, кого я видел, используют адвокатов Ant for C, обращающихся в GCC с exec заданиями.

SCons лучше, но кросс-компиляция не является его сильной стороной. Это не «система сборки», как CMake или Autotools, это всего лишь инструмент сборки. Как говорится в их вики, это в значительной степени "Make in Python" . Тем не менее, он имеет встроенную обработку для зависимостей, что означает, что вам не нужно накатывать свои собственные с помощью «gcc -MM -MD» или чего-либо еще, так что это преимущество перед Make. SCons также имеет поддержку обнаружения сторонних библиотек, которые установлены, но способ, которым это обычно делается, может значительно увеличить время сборки. В отличие от других систем, SCons запускает этап проверки каждый раз, когда вы его запускаете, хотя большинство результатов кэшируются. SCons также печально известен своим длительным временем сборки, хотя для 50 файлов это не было бы проблемой. Поддержка кросс-компиляции в SCons отсутствует - вы должны указать свой , как описано в этой теме, в списке рассылки . Обычно вы заставляете сборку быть похожей на платформу Unix, а затем переопределяете имя компилятора C. Сборка нескольких вариантов или отделение каталога сборки от исходного каталога содержит множество ошибок, что делает его менее подходящим, если вы кросс-компилируете и нативно компилируете свой код.

В CMake и Autotools проблемы с зависимостями выяснены достаточно хорошо, и поддержка кросс-компиляции в autotools является зрелой. CMake имел кросс-компиляцию начиная с версии 2.6.0, которая была выпущена в апреле 2008 года. Вы получаете эти функции бесплатно, а также другие, такие как упаковка и запуск модульных тестов («make check» или аналогичные цели). Недостатком обоих этих инструментов является то, что они требуют начальной загрузки. В случае CMake вам необходимо установить двоичный файл CMake для создания файлов решений Makefiles или Visual Studio. В случае с Autotools это немного сложнее, потому что не всем, кто скомпилирует программное обеспечение, потребуется установить automake и autoconf, только те, которые должны изменить систему сборки (добавление новых файлов считается изменением системы сборки). Двухэтапная загрузка (configure.ac -> configure, configure + Makefile.in -> Makefile) концептуально немного сложнее понять.

Для редактирования: Кросс-компиляция - это дополнительная головная боль в системах сборки, поскольку она усложняет автоматическое обнаружение программ и библиотек. SCons не справляется с этой проблемой, она позволяет вам разобраться. Муравей так же ничего не делает. Autoconf обрабатывает это в случае с автоинструментами, но вам может потребоваться указать «--with-libfoobar = / some / path» в командной строке, когда вы конфигурируете или сталкиваетесь с неработающими ссылками, когда он пытается использовать / usr / lib на этапе компоновки , Подход CMake немного более сложен с файлом цепочки инструментов, но это означает, что вам не нужно указывать все свои инструменты и библиотеки (CC, CXX, RANLIB, --with-ibfoo = и т. Д.), Как они получены из стандартное соглашение. Теоретически вы можете повторно использовать специально созданный файл инструментария CMake в нескольких проектах для их кросс-компиляции. На практике CMake недостаточно широко распространен, чтобы сделать его удобным для вашего среднего хакера, хотя он может быть полезен, если вы создаете несколько проприетарных проектов.

6 голосов
/ 24 июня 2009

Несколько лет назад я много использовал Ant + CppTasks для создания очень больших баз кода, интегрируемых в новый код Java через JNI, и был очень доволен результатами очень надежных инкрементных сборок кода C ++, хорошей гибкостью (в создавать файлы или через твики к коду). НО, CppTasks - это проект без сообщества, и сопровождающий (Курт Арнольд) давно ничего с ним не делал. Он остается очень хорошим и полезным, но имейте в виду, что очень немногие знают или используют CppTasks (способ, которым компиляторы "делают ставки" за файлы, укушает меня, например, когда мне нужен был определенный компилятор для файлов C, и другой компилятор C ++ собирал их вместо этого).

То, как CppTasks отслеживает параметры компиляции и динамически сканирует источники для зависимостей заголовка, все время, но достаточно быстро (есть некоторое кэширование зависимостей), означало, что единственная система, с которой я работал, имела точные инкрементные сборки, что-то очень важно при создании очень больших баз кода.

Итак, как я уже говорил несколько раз в списках пользователей / разработчиков Ant, если у вас много Java-приложений и вы уже вложили средства в Ant, и не боятся погружаться в doc и код CppTasks, и теперь нужно собрать "склеивающий" код JNI и / или "унаследованные" нативные библиотеки, которые предоставляет склеенный код, это достойный соперник, и вознаграждение может быть большим.

Я легко интегрировал для Windows DLL, чтобы добавить полную информацию о версии, например, написать небольшую задачу Ant для правильного форматирования файла .res. Это сработало для меня, но Ant + CppTasks определенно больше для «продвинутого» пользователя / разработчика Ant IMHO.

Надеюсь, это поможет. --DD

3 голосов
/ 13 июля 2009

Я бы порекомендовал terp для сборки проектов C ++ из ANT. Мы разработали terp, потому что ANT - это выбранный нами инструмент сборки, а CppTasks стали немного длиннее, и потому что мы хотели работать на другом уровне абстракции. Terp поддерживает множество различных компиляторов и поддерживается нашей компанией. Для большинства проектов это не бесплатно, хотя.

Мы разработали terp главным образом для полной перестройки, а не для инкрементных сборок с анализом зависимостей. Мы добираемся туда, но его еще нет. Лучшим местом для terp являются многоплатформенные, многоплатформенные выпуски с несколькими компиляторами, где вы не хотите поддерживать n разных конфигураций для всех комбинаций. На данный момент (июль '09) он находится в публичной бета-версии, но скоро будет выпущен.

2 голосов
/ 23 сентября 2011

Последние пять лет я работал над проектом, который делает x86 и сборку с использованием ant. Мы подправили cpptasks для наших целей, чтобы создать универсальный компилятор, который мы просто передаем в префиксе ..., например, arm-gum-linux-gnueabi-, и затем добавляемый к фактическому инструменту, такому как g ++ или ar или как угодно. Отсутствие префикса означает, что вы получаете инструменты для сборки платформ разработки. Наборы инструментов для кросс-компиляции имеют эти префиксы в своих двоичных файлах инструментов сборки. Практически вся причина использования Ant, а не чего-либо, основанного на make, заключалась в способности cpptasks делать нерегулярные сборки и череду вещей, которые должны произойти, чтобы автоконф был доволен. Мы можем поддержать парадигму, согласно которой практически любой исходный файл, особенно файлы в структуре дерева папок для набора библиотек, может быть создан / переименован / удален, и никаких изменений в файлах сборки не требуется. Один маленький недостаток заключается в том, что связывание файлов обновляет свойства таким образом, что это приводит к ненужной перестройке.

<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>
1 голос
/ 24 июня 2009

Ant имеет очень большую Java-базу пользователей (по естественным причинам). Тот факт, что Ant может быть очень полезен в гораздо более широком контексте, - это то, о чем большинство разработчиков не-Java не знают. В результате, если вы используете Ant для создания своего C / C ++ - кодируйте гораздо больше самостоятельно, чем если вы используете систему с большей базой пользователей (CMake или SCons).

Лично я очень доволен CMake, в первую очередь потому, что это единственная система сборки, которая может генерировать реальные проекты Visual Studio. SCons тоже может, но они только делают внешний вызов SCons, в то время как CMake генерирует проекты, которые используют собственный движок сборки Visual Studio. Это очень полезно, если вы работаете вместе с людьми, которые привыкли к Visual Studio.

Я не уверен, что назвал бы поддержку CMake для кросс-компиляции "зрелой", поскольку она все еще довольно молода. Но люди из CMake серьезно относятся к этому, поэтому я без колебаний попробую.

...