2009-04-07 2 views
8

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

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

Когда корень Makefile называется, он вызывает сборочный файл в директории Foo. Вот мои вопросы

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

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

ответ

15

Существует много чего сказать для нет это делается. Прочитано Recursive Make Considered Harmful. Также в PDF form.

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

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

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

+1

Если это не так, это плохая идея, возможно, альтернативное решение должно быть предложено в качестве ответа. – deadalnix

+1

Да. Этот ответ находится в форме, которая больше не является приемлемой на сайте. Редакции лишь частично устраняют недостатки, но это что-то. – dmckee

3

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

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

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

+1

Вы можете использовать POSIX (не GNU) make для выполнения нерекурсивной сборки, разбив ее на два этапа: 1) объединить все файлы make.inc во всех поддиректорах; 2) запустите полученный файл makefile. Но большинство людей используют GNU make anyway, у которого есть директива «include». –

+0

А, это правда, я никогда не слышал об этом. Я обычно использую include. Обычно я хочу быть очень POSIX, но с make-файлами иногда это немного волосатое из-за директивы no include :) – singpolyma

0

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

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