Каков общий способ разрешения зависимостей в Makefile?
Я видел множество методов, используемых для разрешения зависимостей в Makefile, таких как использование gcc -MM
и sed
commond, или использование Директивы include
(плюс немного магии Perl), или qmake
, или automake
, или info make
и т. д.
PS: проект C/CPP.
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.