Каков общий способ разрешения зависимостей в Makefile?


Я видел множество методов, используемых для разрешения зависимостей в Makefile, таких как использование gcc -MM и sed commond, или использование Директивы include (плюс немного магии Perl), или qmake, или automake, или info make и т. д.

Столкнувшись с таким множеством вариантов, я запутался, из которых должен выбрать. Итак, я хочу знать, каков распространенный способ разрешения зависимостей в Makefile в настоящее время? Как лучше всего справиться с этой проблемой?

PS: проект C/CPP.

3 4

3 ответа:

Как правило, если все, что вас интересует, - это системы, поддерживающие GNU make и gcc (такие как все варианты linux и большинство unix-подобных систем в наши дни), вы просто используете различные флаги gcc -M для генерации зависимостей, а затем -include их в вашем файле Makefile. В этом вопросе есть хорошая информация - как правило, нет необходимости использовать sed или какие-либо более сложные инструменты.

Если вам нужно только поддерживать множество дистрибутивов Linux (как вы отметили в комментарии), то я бы рекомендовал automake/autoconf suite.

Этот ответ предполагает, что вы задаете только общие вопросы, и вы еще не знаете, какие конкретные вопросы вам придется решать по ходу дела.

Edit:

GNU make в одиночку может справиться с генерацией зависимостей в рамках вашего собственного проекта.

autoconf обрабатывает необязательные или альтернативные зависимости от сторонних библиотек, инструментов или системных компонентов. automake предоставляет макросы, некоторые из которых иногда полезны, даже если вы используете autoconf Без automake.

Побочное преимущество прямого запуска с automake состоит в том, что ваши файлы Makefile будут вести себя вполне предсказуемо (с точки зрения условностей и переносимости) с меньшими затратами внимания. Отсюда моя скромная рекомендация.

Существует несколько способов создания make-совместимых зависимостей для проектов C / C++:

  • gcc -M, который поставляется в нескольких вариантах и является своего рода" золотым стандартом " с точки зрения точности, поскольку он использует фактический компилятор для генерации зависимостей, и кто лучше знает, как обрабатывать операторы #include, чем сам компилятор?
  • makedepend, что обычно не поощряется в пользу зависимостей, генерируемых компилятором.
  • fastdep, Еще один сторонний генератор зависимостей, который претендует быть быстрее, чем gcc -M.
  • ElectricAccelerator имеет встроенную функцию под названиемautodep , которая использует активность использования файловой системы команд, вызванных в сборке, для генерации информации о зависимостях. Преимущество autodep перед альтернативами заключается в том, что он чрезвычайно быстр и полностью независим от инструментов и языков программирования, в то время как все остальные привязаны к C / C++ или требуют использования определенного компилятора, autodep работает со всеми типами инструментов сборки.

Некоторое время назад я провел сравнение производительности нескольких из этих вариантов.

Отказ от ответственности: я являюсь архитектором и ведущим разработчиком ElectricAccelerator.