Имеет ли смысл писать сценарии сборки на C ++?

15

Я использую CMake для генерации IDE / make-файлов своих проектов, но мне все еще нужно вызывать пользовательские «скрипты» для манипулирования скомпилированными файлами или даже для генерации кода.

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

Кто-то предложил мне использовать C ++ для написания сценариев сборки вместо того, чтобы просто добавлять языковые зависимости. Сами проекты уже используют C ++, поэтому я вижу несколько преимуществ:

  • чтобы построить весь проект, понадобился бы только компилятор C ++ и CMake, больше ничего (все остальные зависимости - C или C ++);
  • Безопасность типов C ++ (при использовании современного C ++) делает все проще, чтобы «исправить»;
  • это также язык, который я знаю лучше, так что мне легче с ним работать, даже если я могу написать хороший код на Python;
  • потенциальный выигрыш в скорости выполнения (но я не думаю, что это будет ощутимо);

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

  • возможно, потребуется больше времени для написания кода (это говорит о том, что я не уверен, потому что я достаточно эффективен в C ++, чтобы написать что-то, что работает быстро, поэтому, возможно, для этой системы это не будет так долго писать) (время компиляции не должно ' это не проблема в этом случае);
  • Я должен предположить, что все текстовые файлы, которые я буду читать как входные данные, находятся в UTF-8, я не уверен, что его можно легко проверить во время выполнения в C ++, и язык не проверит его для вас;
  • библиотеки на C ++ сложнее в управлении, чем на языках сценариев;

Мне не хватает опыта и дальновидности, поэтому, может быть, мне не хватает преимуществ и недостатков. Итак, вопрос: имеет ли смысл использовать C ++ для этого? у вас есть опыт, чтобы сообщить, и вы видите преимущества и недостатки, которые могут быть важными?

Klaim
источник
1
Зависимость от одного языкового интерпретатора для сборки выглядит не так уж и плохо, тем более что это Python - очень переносимый, широко распространенный в Linux и легко доступный в Windows. Если вам нужны дополнительные библиотеки Python, вы можете использовать virtualenv, и он не будет добавлять ничего, кроме одного файла Python (который вы могли бы отправить), интернет-соединения и небольшого количества сантехники для настройки virtualenv, установки их в и запуска фактической создавать сценарии в этой среде. Вы можете перейти к дополнительному скрипту в вашей сборке и интернет-соединению по требованию.
Вы можете угадать кодировку текста с довольно хорошей надежностью.
DeadMG
@DeadMG Да, но делать это вручную, если слишком много работы (если вы хотите получить правильное предположение, а не ограничивать себя «это ascii или unicode, и если это unicode, сколько битов и какой порядок байтов?») И добавление еще одной зависимости (если для этого вообще есть свободная и автономная библиотека) лишает смысла переходить на C ++ и останавливаться в зависимости от Python.
@delnan Да, но он все еще на другом языке для установки. Из вашего описания, любая дополнительная зависимость не будет выглядеть «слишком плохо», но я рассматриваю это, потому что уже есть чем управлять, поэтому, возможно, это поможет ограничить используемые языки. Я также использую встроенный язык сценариев (реализованный на C ++ непосредственно в проекте), javascript / HTML / CSS, XML и другие форматы, о которых уже нужно помнить.
Klaim
2
что вы будете использовать для сборки сценария сборки c ++?
JK.

Ответы:

24

Просто используйте Python.

Я занимаюсь разработкой на C ++ и делаю свои сценарии сборки на Python, и мне было бы больно делать сценарии сборки на C ++:

  • Python упрощает манипулирование словарями, списками, вложенными словарями словарей списков и т. Д. (Например, один из моих сценариев использует многоуровневую иерархию всех моих инструментов, версий инструментов и версий инструментов). C ++ может делать то же самое с шаблонами и пользовательскими классами, но он гораздо более многословен (что приводит к большему количеству строк кода, что обычно приводит к снижению производительности).
  • Python предоставляет высокоуровневые библиотеки и подпрограммы, такие как обработка XML и JSON, подпроцесс и os.walk . Опять же, C ++ может сделать это, но гораздо больше работы по поиску библиотек, изучению их API, правильной компоновке вызовов (которые часто являются более низкими уровнями) и т. Д.
  • Сценарии сборки - это занятие без добавленной стоимости (заимствовать термин из Lean). Лучше использовать язык как можно более высокого уровня, чтобы сделать его как можно быстрее, чтобы вернуться к работе, которая приносит пользу вашим пользователям.
  • По моему опыту, сценарии сборки имеют тенденцию к непредвиденному росту. Даже если задача кажется изначально простой для C ++, она может усложниться в спешке. Когда возникает новое требование, часто гораздо проще справиться с обработкой в ​​скрипте Python, чем с C ++ (что может потребовать поиска или чтения новых библиотечных API-интерфейсов и т. Д.).

Что касается преимуществ, которые вы перечислите для C ++:

  • Добавление одной зависимости (Python) не должно значительно усложнять вашу сборку. Например, это уже стандарт для большинства установок Linux. Благодаря библиотекам Python «с батарейками» управлять им может быть даже проще, чем библиотеками C ++, от которых будут зависеть ваши сценарии сборки.
  • Безопасность типов, предоставляемая C ++, наиболее полезна для больших проектов, а не для небольших сценариев.
  • Python очень хорошо дополняет C ++ (высокоуровневый или низкоуровневый, динамически типизированный и статически типизированный и т. Д.) И даже может очень хорошо интегрироваться с C ++ (благодаря SWIG и Boost.Python), если впоследствии вы захотите это сделать, поэтому стоит учиться на программиста C ++.
  • Как вы сказали, скорость выполнения не должна быть проблемой.
Джош Келли
источник
Мы сделали это (сборки Python) после года борьбы с cmake над проектом с кросс-формой. В конце концов, мы даже не удосужились попытаться выполнить проверку зависимостей (самая сложная часть сборки). Поскольку для автоматизированных сборок вы все равно хотите перестроить, и в C ++ существует множество сложных зависимостей
Мартин Беккет,
1

Я считаю, что это вопрос конкретного случая. Я бы сказал, что нет правильного ответа, имеет ли смысл использовать C ++ для сценариев сборки, или нет. Единственный способ понять это - попробовать это на практике.

Лично я бы увидел, что Python превосходит C ++ из-за лучшей выразительности языка и более простых (разумеется, личного мнения) стандартных библиотечных инструментов для управления задачей манипулирования двоичными файлами и генерации кода. Конечно, сложные библиотеки, разработанные для этой задачи, могут быть доступны, но если нет, то я бы лично сделал ставку на то, что Python будет «более правильным» ответом - в общем случае.

zxcdw
источник
1

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

Используйте что-то вроде SCONS или даже Maven 3, который поддерживает системы сборки C ++ .

Хорошая система сборки, независимо от языка, не должна требовать настраиваемой логики в форме сценариев для построения работающего исполняемого артефакта.

Если вам нужно написать скрипты для системы сборки, чтобы настроить ее, это не очень хорошая система сборки. Написание плагина для системы сборки - это отдельная история, но, тем не менее, она должна быть очень специфичной для среды / оборудования, и к ней следует редко прибегать.


источник
1
Как я уже объяснил, я уже использую cmake, но мне все еще нужны пользовательские сценарии. Я говорю об этих пользовательских скриптах, а не о самом процессе сборки.
Klaim
1
Я люблю Maven - сценарий, необходимый для создания программы на языке «Адский мир», длиннее, чем программа!
Quant_Dev
@quant_dev, я помню, как в первый раз, когда я смотрел на Maven на своей собственной веб-странице, они рекомендовали начать работу с кем-то, кто уже знает maven, поскольку его сложно настроить в первый раз. Это был первый признак того, что я не хотел иметь с этим ничего общего!
Брейди
Мне понравились SCons, он немного медленный, но очень простой в использовании.
quant_dev
1
@JarrodRoberson Я использовал "сценарии" слишком свободно. Я имею в виду его конфигурационные файлы. Я не уверен, что декларативность делает Maven автоматически более портативным и простым в обслуживании. Это делает его менее гибким, что может быть проблемой в больших проектах.
quant_dev
0

Чтобы сосредоточиться на вопросе:

Имеет ли смысл писать сценарии сборки на C ++?

Ответ прост: нет .

В настоящее время принятый ответ увеличивает масштаб на python и перечисляет целую кучу действительных проблем, но я хотел бы добавить независимую от языка причину:

Вы действительно не хотите писать что-либо на любом скомпилированном языке, если можете помочь:

  • Вам понадобится скрипт для его запуска!
  • Или вам нужно проверить скомпилированный скрипт в системе контроля версий (и синхронизировать его с проверенными источниками!)
  • К сценарию неожиданно также добавляется конфигурация сборки для сценария. (Это нужно поддерживать!)

Кроме того, перейдем к другому ответу:

Возможно, вы также не хотите использовать «сырой» язык сценариев для создания ваших сценариев сборки (я понимаю, что сложности C ++ будут обрабатываться CMake).

Что вы, вероятно, должны сделать, это выбрать один из Build . Системы . из . есть . и посмотрите, подходит ли вам ваш счет по отношению к. Возможность написания сценариев / расширяемость / play-nice-with-CMake / кроссплатформенность.

Мартин Ба
источник