2012-06-01 4 views
4

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

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

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

+0

это зависит от ситуации, можете ли вы объяснить немного о своих проблемах с файлами, чтобы мы могли лучше вам помочь? – pyCthon

+0

Это также потенциально зависит от того, какие платформы вам нужно поддерживать (насколько портативны они должны быть). –

+0

@pyCthon на самом деле проблема заключается в простой проблеме зависимости. Такие, как в файле заголовка, изменены, повторное выполнение команды 'make' приведет к повторному генерированию соответствующего объектного файла. Я хочу знать, это «лучший» или «общий» способ решить эту проблему. Благодарю. – injoy

ответ

1

Вообще, если все, что вы заботитесь о системах, которые поддерживают GNU делают и GCC (например, все варианты Линукс и наиболее Unix подобных систем в эти дни), вы просто использовать различные -M флаги GCC для генерации зависимостей, а затем -include их в вашем Makefile. Есть некоторая хорошая информация in this question - как правило, нет необходимости использовать sed или более сложные инструменты.

+0

Спасибо за ваши советы :-) – injoy

0

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

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

Edit:

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

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

Боковое преимущество от automake - это то, что ваши make-файлы будут вести себя вполне предсказуемо (с точки зрения условностей и переносимости) с меньшими затратами внимания.

Отсюда моя скромная рекомендация.

+0

automake/autoconf действительно нужен, только если вам нужно поддерживать системы NON-linux. Если все, о чем вы заботитесь, это Linux, просто используйте GNUmake –

+0

Спасибо большое! – injoy

+0

@ChrisDodd - +1 к вашему ответу. Я расширил свой ответ сейчас, когда вы помогли мне лучше понять суть этого вопроса. Я подозреваю, что мой может основываться на несколько устаревшем личном опыте, но я позволю сообществу об этом судить. –

0

Есть несколько способов генерации make-совместимый зависимостей для C/C++ проектов C:

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

Я сделал a performance comparison нескольких из этих вариантов некоторое время назад.

Отказ от ответственности: Я архитектор и ведущий разработчик ElectricAccelerator.

Смежные вопросы