Создание вложенного make-файла - PullRequest
8 голосов
/ 07 апреля 2009

Я изучаю makefiles и знаю, как создать простой make-файл. Я перехожу к вложенным make-файлам. Вот моя структура каталогов

/src
...makefile
...main.cpp
...foo
......makefile
......foo.cpp
......foo.h

Когда вызывается root makefile , он вызывает make-файл в каталоге foo . Вот мои вопросы

  1. Какой makefile следует использовать для написания кода для связывания всех объектных файлов? Если он находится в корневом make-файле, нужно ли указывать там все имена объектных файлов?
  2. Является ли этот вложенный make-файл лучшей практикой? Или хорошо иметь только один make-файл, который находится в корне?

Любая помощь будет отличной!

Ответы [ 3 ]

15 голосов
/ 07 апреля 2009

Многое можно сказать о , а не . Прочитайте Рекурсивное создание, считающееся вредным . Также в формате PDF .

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

Чтобы решить эту проблему, вы организуете одну нерекурсивную программу make, которая создает единственное всеобъемлющее дерево зависимостей, которое позволяет программе make решить все вышеуказанные проблемы.

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

3 голосов
/ 07 апреля 2009

Рекурсивное создание обычно считается вредным.

Если вы действительно хотите набрать «make» в корневом каталоге и заставить его собирать все, используя только make-файлы POSIX, это единственный способ. В этом случае, свяжите подпроекты в их собственном каталоге, а финальные вещи в корне.

Если вы хотите использовать синтаксис gmake, взгляните на Makefiles здесь: http://github.com/singpolyma/theveeb-ecosystem

0 голосов
/ 07 апреля 2009

Существуют более современные системы сборки, такие как SCons , которые имеют более простой синтаксис, чем make, и позволяют избежать многих ловушек make. Например, SCons сканирует исходные файлы, чтобы определить зависимости самостоятельно, тогда как для make необходимо указать зависимости вручную. Если вы, например, добавление нового оператора #include в файл реализации make не будет перекомпилировать этот файл реализации при изменении заголовка (если вы не добавите новую зависимость). SCons автоматически обнаружит новую зависимость и перекомпилирует все необходимое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...