Я смотрю на запуск нового проекта на C ++ - изначально только в свое время - и исследую доступные системы сборки. Казалось бы, ответ «многие, и все они ужасны».
Функции, которые мне особенно нужны для этого:
- Поддержка C ++ 11
- Кроссплатформенность (Linux в качестве основной цели, но может работать как минимум на Windows)
- Достойная поддержка юнит тестирования
- Поддержка нескольких модулей для разделения кода
- Поддержка генерации кода (используя asn1c или protobuf - пока не уверен на 100%)
- Простота в обслуживании
Теперь я знаю, что достаточно легко справлюсь с 1-4 из них, используя CMake и Autotools. Возможно также со SCons и Waf и парой других тоже. Проблема в том, что я никогда не понимал, как правильно выполнять генерацию кода, используя их - это исходные файлы, которые не существуют до первого запуска процесса сборки, поэтому исходные файлы, которые система сборки должна быть в состоянии преобразовать в исполняемый код но на самом деле не знает, пока не начнется сборка ... (в частности, ASN1C генерирует десятки заголовочных и исходных файлов, которые должны иметь возможность работать вместе, а фактический набор генерируемых файлов зависит от содержимого вашего asn-файла). а также тот факт, что ни один из них не особенно прост в обслуживании - у CMake и Autotools есть свой огромный набор скриптов, которыми нужно управлять, чтобы они работали,
Итак - какие системы сборки рекомендуются для чего-то подобного? Или я пока застряну с файлами make и скриптами оболочки?
Ответы:
+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 и встроенную информацию о версии, чтобы несколько клиентов / серверов могли работать одновременно с разными версиями (для одного и того же «клиента» или «сервера»). Много сгенерированного исходного кода. Мы могли бы «притвориться», что это «система сборки», но на самом деле это нетривиальная инфраструктура для «управления конфигурацией», частью которой является «система сборки». Например, эта система должна была «снять» и «
источник
Вы можете использовать Gradle сейчас: https://docs.gradle.org/current/userguide/native_software.html
Похоже, что это повзрослело за те годы, что я опубликовал. Страница с сообщением о том, что проект «инкубируется», исчезла, но я не могу найти никакого официального объявления об удалении этого статуса.
источник
Я нашел это, я лично еще не использовал их все:
Ниндзя , небольшая система сборки, ориентированная на скорость. Google теперь использует Ninja для сборки Android вместо ссылки Make : .
Shake , мощная и быстрая система сборки.
Туп , высокопроизводительная система сборки. Алгоритмический дизайн. Анализ Туп .
Все они теперь кроссплатформенные и поддерживают Windows. Я еще не уверен в остальных ваших требованиях, так как, опять же, мне еще предстоит проверить их самостоятельно. Они используются в коммерческой разработке, CIG подобрал Ninja. Я использовал и люблю легкость и скорость ниндзя с генератором проектов. Первые два сродни булочкам, муравьям и т. Д.
источник
javac
внутренними классами, которые разделены наclass$1.class
файлы), плохо написано и использует системные хаки для достижения того, что делает. Это отлично подходит для небольших систем; не поддерживается для более крупных проектов..tup/mnt
. Затем он запускает все программы сборки в папке (т. Е..tup/mnt/@tupjob-XXXXX
) В качестве рабочего каталога, чтобы отслеживать операции чтения / записи, применяя конфигурацию сборки. Это работает хорошо, если путь не хранится абсолютно (то есть с символами). Когда вы компилируете двоичный файл, путь символа сохраняется в самом двоичном файле. Это означает, что когда GDB пытается загрузить символы, он ищет этотtupjob
путь, который не существует, что вызывает ошибки.Scons очень дружелюбная и гибкая система, но вы правы, Лотар, она действительно медленная.
Но есть способ повысить производительность программ, написанных на Python. Это использование JIT. Из всех известных проектов PyPy является очень мощной, быстрорастущей и мотивированной реализацией JIT - Python 2.7. Совместимость PyPy с Python 2.7 просто потрясающая. Однако Scons объявлен как неподдерживаемый проект в википедии по совместимости PyPy . С другой стороны, Waf , смоделированный как основатель Python для автоинструментов, полностью поддерживается инфраструктурой PyPy. В моих проектах скорость сборки увеличилась в 5-7 раз при переходе на PyPy. Вы можете увидеть отчеты о производительности от PyPy .
Для современной и относительно быстрой сборки системы Waf является хорошим выбором.
источник
Система сборки Google является хорошей альтернативой: http://bazel.io/
источник
Я использовал SCons и впечатлен этой системой сборки. SCons расширяется с помощью python и самого python - это здорово, потому что Python имеет все, что вам нужно, просто кодируйте логику, все низкоуровневые функциональные возможности уже реализованы в SCons и Python и являются кроссплатформенными. Если у вас хорошие навыки программирования, ваши сценарии сборки будут выглядеть идеально и легко.
Make, CMake и подобные системы сборки кажутся мусором макросов. Ваф является аналогом SCons. Я пробую Ваф, но SCons будет более дружелюбным, поэтому я остался с SCons.
По мнению толпы, SCons слишком медленный, но в середине проекта я не видел никакой разницы между make и SCons по скорости сборки. Вместо этого SCons хорошо работал с параллельными сборками, в то время как у make большие проблемы с этим.
Кроме того, SCons позволяет вам получать - настраивать, создавать, развертывать, генерировать конфигурацию из шаблонов, запускать тесты и выполнять любые другие задачи, которые могут быть выполнены с помощью Python и SCons - все в одном. Это очень большое преимущество.
Для простого проекта CMake также является хорошим выбором.
источник
просто добавить мои центы: premake
http://industriousone.com/premake
В вики также есть специальная веб-страница .
источник
ant
также поддерживает C / C ++, посмотрите, хорошо ли это для вас, это фамилия, которую я имею, я просто использую Makefiles и Cmake для этого.Вы можете использовать Ceedling . Обратите внимание, однако, что на данный момент он поддерживает только C и тесно связан с авторскими средами тестирования Unity и CMock.
Он может быть разветвлен и модифицирован для работы с компилятором C ++ и фреймворком модульного тестирования / моделирования.
Также Tup заслуживает упоминания. Он очень быстрый, но ничего не знает о тестировании фреймворков и т. Д., Что означает, что вам придется писать свою собственную систему сборки с использованием Tup. Если вы планируете заняться TDD, вероятно, вам подойдет Tup.
источник