Системы сборки C ++ - Что использовать? [закрыто]

136

Я смотрю на запуск нового проекта на C ++ - изначально только в свое время - и исследую доступные системы сборки. Казалось бы, ответ «многие, и все они ужасны».

Функции, которые мне особенно нужны для этого:

  1. Поддержка C ++ 11
  2. Кроссплатформенность (Linux в качестве основной цели, но может работать как минимум на Windows)
  3. Достойная поддержка юнит тестирования
  4. Поддержка нескольких модулей для разделения кода
  5. Поддержка генерации кода (используя asn1c или protobuf - пока не уверен на 100%)
  6. Простота в обслуживании

Теперь я знаю, что достаточно легко справлюсь с 1-4 из них, используя CMake и Autotools. Возможно также со SCons и Waf и парой других тоже. Проблема в том, что я никогда не понимал, как правильно выполнять генерацию кода, используя их - это исходные файлы, которые не существуют до первого запуска процесса сборки, поэтому исходные файлы, которые система сборки должна быть в состоянии преобразовать в исполняемый код но на самом деле не знает, пока не начнется сборка ... (в частности, ASN1C генерирует десятки заголовочных и исходных файлов, которые должны иметь возможность работать вместе, а фактический набор генерируемых файлов зависит от содержимого вашего asn-файла). а также тот факт, что ни один из них не особенно прост в обслуживании - у CMake и Autotools есть свой огромный набор скриптов, которыми нужно управлять, чтобы они работали,

Итак - какие системы сборки рекомендуются для чего-то подобного? Или я пока застряну с файлами make и скриптами оболочки?

Грэхем
источник
11
«Может показаться, что ответ« многие, и все они ужасны »» - тоже мое впечатление (с добавлением «ужасно с моей точки зрения»; я не люблю обобщать слишком много с такими терминами, как эти ). Я на самом деле настроил свою собственную по этой самой причине, и она сработала лучше, чем ожидалось, поскольку она делает то, что я хочу, и как я всегда хотела, чтобы все работало. Для чего-то, что занимает немного меньше времени, вам, вероятно, придется изучить существующие инструменты и выбрать один, который даст вам меньше головной боли, чем другие.
Кристиан Штибер
4
Попробуй Туп .
Kerrek SB
смотрите также: stackoverflow.com/q/3349956
ergosys
8
Какого рода поддержку C ++ 11 вы ожидаете от системы сборки? Это то, что вы получаете от компилятора, система сборки не анализирует и даже не читает фактические исходные файлы, а просто передает их тому, кто в них нуждается, нет?
Барух,
5
Это правда, но было бы легко сказать компилятору использовать поддержку C ++ 11. g ++ нужен один флаг, лягнуть другой набор, msvc явно не нужен и так далее. Кроме того, была бы полезна поддержка определения доступных функций c ++ 11, поскольку они также различаются в разных компиляторах ...
Грэм

Ответы:

117

+1 за "Многие, и они ужасны".

Но наиболее «богатым» и «наиболее масштабируемым» является, вероятно, CMake , который является генератором Makefile (также генерирует собственный MSVC ++ *.proj/ *.sln). Странный синтаксис, но как только вы его изучите, он может позволить вам сгенерировать сборки для разных платформ. Если бы я «начал заново», я бы, наверное, использовал CMake. Он должен обрабатывать ваш список, хотя ваша «генерация кода» может занять «собственную жизнь» за пределами системы сборки, в зависимости от того, что вы хотите сделать. (Увидеть ниже.)

Для простых проектов генератор QMake в порядке (вам не нужно использовать библиотеки Qt для использования QMake). Но вы не описываете «простой» - генерация кода и «дополнительные фазы» означают, что вы, вероятно, хотите CMakeили что-то с богатым API для ваших собственных расширений, например Scons(или Waf).

Мы используем Scons на работе. Он производит «пуленепробиваемые сборки», но он действительно медленный. Ни одна другая система не будет такой пуленепробиваемой, как Scons. Но это медленно. Он написан на Python, и мы расширили интерфейс для нашей «организации рабочего пространства» (где мы просто указываем зависимости модуля), и это является частью Sconsзамысла проекта (этот тип расширения через Python). Удобно, но сборки идут медленно. Вы получаете пуленепробиваемые сборки (любой ящик разработчика может сделать финальную версию), но это медленно. И это медленно. Не забывайте, что если вы используете Scons, это медленно. И это медленно.

Мне больно думать, что десятилетие после 2000 года у нас все еще нет летающих автомобилей. Возможно, нам придется ждать еще сто лет или что-то, чтобы получить их. И тогда мы все, вероятно, будем летать на наших летающих машинах, которые все еще строятся с дерьмовыми системами сборки.

Да, они все ужасны.

[О ПОКОЛЕНИИ КОДА]

Sconsработает на «фазах», и они «несколько статичны». Он может создавать код, который генерируется как часть сборки (люди делают это несколькими разными способами), но это было описано как «нечто очень не похожее на Scons».

Если это просто «предварительно обработать некоторые файлы и сгенерировать исходные файлы», то ничего страшного (у вас много вариантов, и именно поэтому qmakeбыло написано - для mocпредварительной обработки *.hpp/*.cppфайлов).

Тем не менее, если вы делаете это в «тяжелой манере», вам нужно будет написать собственный сценарий. Например, у нас были скрипты «как часть сборки», которые запрашивали базы данных и генерировали классы C ++ для взаимодействия между «слоями» (в традиционной 3-уровневой разработке приложений). Аналогичным образом мы сгенерировали исходный код сервера / клиента с помощью IDL и встроенную информацию о версии, чтобы несколько клиентов / серверов могли работать одновременно с разными версиями (для одного и того же «клиента» или «сервера»). Много сгенерированного исходного кода. Мы могли бы «притвориться», что это «система сборки», но на самом деле это нетривиальная инфраструктура для «управления конфигурацией», частью которой является «система сборки». Например, эта система должна была «снять» и «

Чарли
источник
37
Мне тоже нравится Scons - но я думаю, что это медленно.
Лотар
1
Вы можете заставить CMake обрабатывать генерацию кода с помощью оболочки Makefile, чтобы выполнить дополнительный второй этап при генерации кода. Мне удалось поддерживать полное отслеживание зависимостей, ранний выход после генерации кода для запуска повторного создания и т. Д. См. Javaglue.com/javaglue.html#tag:JavaGlue и code.google.com/p/javaglue
sdw
3
Спустя почти 2 года, вы все еще считаете SCons медленными? Когда я выбирал систему сборки, я столкнулся с этим, и это способствовало моему решению пойти с SCons.
Дж.Бентли
2
@ Бен, это правда, но тоже медленно.
Чарли
2
Любой, кто смотрит на это, должен рассмотреть Meson (который использует ниндзя).
Мэтью Д. Шолфилд
33

Вы можете использовать Gradle сейчас: https://docs.gradle.org/current/userguide/native_software.html

Похоже, что это повзрослело за те годы, что я опубликовал. Страница с сообщением о том, что проект «инкубируется», исчезла, но я не могу найти никакого официального объявления об удалении этого статуса.

Нейт Гленн
источник
Я бы согласился с Gradle. Gradle разработан для масштабирования. Тем не менее, это зависит от того, насколько быстро он работает. Есть также некоторые накладные расходы для самого gradle. Также имейте в виду, что некоторые плагины, возможно, должны быть настроены для ваших случаев использования.
JE42
Интересно увидеть интерес Gradle к поддержке C ++. Надеюсь, что они создадут хорошую и надежную систему сборки для проектов c ++, которые нам всем не хватает.
hbobenicio
Спасибо @squid, обновлено.
Нейт Гленн
1
Gradle мощный, но простой. Никакого странного синтаксиса, одного файла gradle.build часто достаточно для создания всего проекта с несколькими исполняемыми выходными данными (main, tests и т. Д.). Нет файловых дампов по всем исходным каталогам. Супер дружелюбный для версионирования.
Overdrivr
1
Я провел последние два дня, сражаясь с Gradle, просто пытаясь создать библиотеку «hello world», приложение и gtests, и я не могу сказать, что могу рекомендовать его для нового проекта. Инструменты могут быть все есть, но документации нет (дает преимущество сомнения). Может быть, те из вас, кто считает это жизнеспособным, могут указать на ваши любимые ресурсы?
JWM
16

Я нашел это, я лично еще не использовал их все:

Ниндзя , небольшая система сборки, ориентированная на скорость. Google теперь использует Ninja для сборки Android вместо ссылки Make : .

Shake , мощная и быстрая система сборки.

Туп , высокопроизводительная система сборки. Алгоритмический дизайн. Анализ Туп .

Все они теперь кроссплатформенные и поддерживают Windows. Я еще не уверен в остальных ваших требованиях, так как, опять же, мне еще предстоит проверить их самостоятельно. Они используются в коммерческой разработке, CIG подобрал Ninja. Я использовал и люблю легкость и скорость ниндзя с генератором проектов. Первые два сродни булочкам, муравьям и т. Д.

leetNightshade
источник
1
Tup испортит поиск символов, не будет хорошо работать с любой другой системой сборки (вообще-то, на самом деле), не будет хорошо играть со случайными выходными данными (такими как классы, сгенерированные javacвнутренними классами, которые разделены на class$1.classфайлы), плохо написано и использует системные хаки для достижения того, что делает. Это отлично подходит для небольших систем; не поддерживается для более крупных проектов.
Qix - МОНИКА ПРОИЗОШЛА
@Qix: Разве вы не можете хранить вывод отдельно от вашего хранилища?
Kerrek SB
1
@KerrekSB Вы можете, но это не проблема с поиском символов. Tup использует FUSE и монтирует свое промежуточное ПО в .tup/mnt. Затем он запускает все программы сборки в папке (т. Е. .tup/mnt/@tupjob-XXXXX) В качестве рабочего каталога, чтобы отслеживать операции чтения / записи, применяя конфигурацию сборки. Это работает хорошо, если путь не хранится абсолютно (то есть с символами). Когда вы компилируете двоичный файл, путь символа сохраняется в самом двоичном файле. Это означает, что когда GDB пытается загрузить символы, он ищет этот tupjobпуть, который не существует, что вызывает ошибки.
Qix - МОНИКА ПРОИЗОШЛА
И Tup, и Ninja являются инструментами очень низкого уровня, такими же низкими или когда-либо низкими, как Make. Они не приспособлены для C ++. Я бы даже не назвал эти инструменты самостоятельной сборкой систем, поскольку в них отсутствуют многие важные высокоуровневые функции, которые настоящие системы сборки предлагают для решения сложных реальных проектов. Некоторые из этих систем могут использовать ниндзя в качестве серверной части.
Йохан Буле
11

Scons очень дружелюбная и гибкая система, но вы правы, Лотар, она действительно медленная.

Но есть способ повысить производительность программ, написанных на Python. Это использование JIT. Из всех известных проектов PyPy является очень мощной, быстрорастущей и мотивированной реализацией JIT - Python 2.7. Совместимость PyPy с Python 2.7 просто потрясающая. Однако Scons объявлен как неподдерживаемый проект в википедии по совместимости PyPy . С другой стороны, Waf , смоделированный как основатель Python для автоинструментов, полностью поддерживается инфраструктурой PyPy. В моих проектах скорость сборки увеличилась в 5-7 раз при переходе на PyPy. Вы можете увидеть отчеты о производительности от PyPy .

Для современной и относительно быстрой сборки системы Waf является хорошим выбором.

aegor
источник
Стоит отметить, что scons теперь помечен как «Совместимый» на связанной вики-странице, поэтому теперь он работает с PyPy.
Фальшивое имя
8

Система сборки Google является хорошей альтернативой: http://bazel.io/

Майк Б
источник
3
Msgstr "Кроссплатформенность (основная цель Linux, но она может быть построена как минимум на Windows)". В разделе часто задаваемых вопросов Базеля говорится: «В настоящее время мы активно работаем над улучшением поддержки Windows, но до сих пор это невозможно».
Майкл Мрозек
3
Я не уверен, что это была система или парень, который создал проект, но у меня была сильная боль в спине при использовании этого @ work. Он очень негибкий (в том смысле, что он поддерживает только один способ работы, часто неоптимальный, если не страшный), недостаточно мощный, плохо документированный (за исключением базовых случаев), имеет небольшое сообщество, поэтому не ожидайте, что стекопоток придет, если вас не спасут Сама по себе зависимость, не очень хорошо с большинством IDE на большинстве систем и т. д., и т. д. и т. д. Так что, если вы не фанат google - держитесь подальше от этого (кстати, есть версия для Facebook, называемая Buck - для фанатов фейсбука)
Слава
Эй, я нашел, что это действительно легко использовать после 6 недель, пытаясь заставить работать CMake. Я хотел, чтобы он загрузил сторонние зависимости и скомпилировал их (как я привык к хорошим инструментам сборки из python и JavaScript). Это упростило задачу, но у нее есть недостаток, заключающийся в том, что вам, возможно, придется писать собственные файлы Bazel для сторонних разработчиков, которые не поддерживают ее. Им нужен центральный репо, чтобы хранить их в изумлении.
CpILL
6

Я использовал SCons и впечатлен этой системой сборки. SCons расширяется с помощью python и самого python - это здорово, потому что Python имеет все, что вам нужно, просто кодируйте логику, все низкоуровневые функциональные возможности уже реализованы в SCons и Python и являются кроссплатформенными. Если у вас хорошие навыки программирования, ваши сценарии сборки будут выглядеть идеально и легко.

Make, CMake и подобные системы сборки кажутся мусором макросов. Ваф является аналогом SCons. Я пробую Ваф, но SCons будет более дружелюбным, поэтому я остался с SCons.

По мнению толпы, SCons слишком медленный, но в середине проекта я не видел никакой разницы между make и SCons по скорости сборки. Вместо этого SCons хорошо работал с параллельными сборками, в то время как у make большие проблемы с этим.

Кроме того, SCons позволяет вам получать - настраивать, создавать, развертывать, генерировать конфигурацию из шаблонов, запускать тесты и выполнять любые другие задачи, которые могут быть выполнены с помощью Python и SCons - все в одном. Это очень большое преимущество.

Для простого проекта CMake также является хорошим выбором.

Торстен
источник
3
Моя проблема здесь в том, что я избалован. Я по профессии разработчик Java, и такие инструменты, как Gradle в мире Java, - это те инструменты, которые мне бы очень хотелось использовать для разработки на C ++. Я могу настроить проект gradle без внешних зависимостей, используя однострочный файл сборки. Вот и все. Многомодульные проекты, которые имеют множество зависимостей, по-прежнему просты в выполнении, и на самом деле их вес намного меньше, чем в простом проекте C ++ ...
Грэм
У меня были проблемы при создании других пакетов, которые используют Scons, потому что он не абстрагирует флаги конфигурации системы, такие как -I, включая dirs и -L, библиотеки dirs. Это не займет CFLAGS, вам часто приходится модифицировать каждый скрипт scons, чтобы он выглядел в нужном месте.
ACyclic
5

просто добавить мои центы: premake

http://industriousone.com/premake

В вики также есть специальная веб-страница .

user827992
источник
2
К сожалению, Premake не поддерживает генерацию кода в соответствии с требованиями OP. И я бы не назвал его поддержку модульного тестирования «приличным», хотя есть несколько вещей, которые вы можете сделать.
ergosys
@ergosys Я заметил, что ant не упоминается, antтакже поддерживает C / C ++, посмотрите, хорошо ли это для вас, это фамилия, которую я имею, я просто использую Makefiles и Cmake для этого.
user827992
2

Вы можете использовать Ceedling . Обратите внимание, однако, что на данный момент он поддерживает только C и тесно связан с авторскими средами тестирования Unity и CMock.

Он может быть разветвлен и модифицирован для работы с компилятором C ++ и фреймворком модульного тестирования / моделирования.

Также Tup заслуживает упоминания. Он очень быстрый, но ничего не знает о тестировании фреймворков и т. Д., Что означает, что вам придется писать свою собственную систему сборки с использованием Tup. Если вы планируете заняться TDD, вероятно, вам подойдет Tup.

thegreendroid
источник