2015-01-06 2 views
2

Я знаю идею использования рекурсивных make-файлов. Будут ли последующие make-файлы, такие как следующее, быть обновлены исключительно на любых изменениях в последующих make-файлах?Makefile: как обнаружить изменения внутри самого файла makefile?

.: например

#parent makefile. no changes here. 
subsystem: 
    cd subdir && $(MAKE) 

Если Makefile внутри подкаталог была изменена таким образом, что следующее не имеет места (например, только GCC флаг был изменен), то будет обновляться объектные файлы?

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

ответ

2

Единственная причина, по которой, как написано, сделать даже прогоны, что правило вообще не связано с тем, что subsystem и subdir не совпадают.

Если в этом каталоге когда-либо создавался файл или каталог subsystem, это правило перестало бы функционировать.

Если .PHONY: subsystem1 были добавлены, что проблема была бы неподвижна и это правило будет всегда будет работать, когда перечисленные в командной строке (т.е. make subsystem). (Как указано в комментариях .PHONY является расширением GNU. Раздел, следующий за связанным разделом, обсуждает переносимую альтернативу. Хотя стоит отметить, что они не полностью идентичны тем, что .PHONY имеет некоторые дополнительные преимущества и некоторые дополнительные ограничения.)

В любом из этих случаев цель subsystem не обращает внимания на даты модификации чего-либо (так как в нем не указаны предварительные условия).

Для того чтобы цель зависела от изменений в файле makefile, вам необходимо указать makefile (ы) как предпосылки, как и все остальное (например, subsystem: subdir/Makefile). Листинг это как .PHONY, скорее всего, правильнее и более того, что вы хотите.

Нет, ничто в том, чтобы сама себя отслеживать, не является обязательным условием. Таким образом, флаг изменяется/etc. не запускайте перестройки. Однако есть способы сделать эту работу для make (они включают сохранение используемых флагов в файлах, которые сами являются предпосылками целевых объектов, использующих эти флаги, и т. Д.). Есть вопросы и ответы на SO о том, как это сделать (у меня нет их готовых от рук, хотя).

Другие инструменты действительно обрабатывают изменения флага автоматически. Я считаю, что инструменты Electric Cloud делают это. Я считаю, CMake делает. Могут быть и другие.

+1

'.PHONY' полезен, но вы можете упомянуть, что это расширение в GNU make, но не присутствует вообще в make-реализациях. – Edward

+0

Подождите, если вы упомянете make-файл как предварительное условие, не обнаружите, есть ли какие-либо изменения в этом целевом make-файле? Более конкретно, если вы изменяете флаг в рецепте целевого файла makefile, выполняет ли этот makefile полностью или просто вводит и выходит из него, фактически ничего не делая? (Вы подразумевали последнее). Это предполагает, что вся сборка завершена, и только один флаг в одном рецепте изменен (никаких целей в make-файлах не изменено, кроме целевого самого файла makefile. «Нет, ничто в том, чтобы заставить себя отслеживать не требуемые условия». Меня смутило. – imagineerThat

+0

@imagineerThat Modify (для целей make) make-файл указан как предварительное условие, и он будет запускать любые цели, которые перечисляют его как предварительное условие, да. Как и в случае с обычным предварительным условием. make не достаточно умен, чтобы знать *, который * хотя (если в модифицированном make-файле есть несколько). Однако изменение флага не приведет к тому, что цели будут * использовать *, этот флаг будет перестроен, если ни одно из целевых предварительных условий не изменилось. –

2

Вы можете включить Makefile как зависимость, так же, как и любой другой файл:

mytarget.o: mytarget.c Makefile 
+0

В этом случае будут ли какие-либо текстовые изменения внутри будет обнаружен файл Makefile зависимостей? – imagineerThat

+0

@imagineerThis Да, это приведет к восстановлению здесь для ** любых ** изменений в make-файле. Соответствует этой цели или нет. –

+0

@ EtanReisner прав - невозможно (даже теоретически) сказать, были ли изменения в заданном TARGET, так как мы не знаем, что сказал make-файл при последнем компиляции. –

2

Рекурсивной Makefiles выполняется ли или нет что-то изменилось. Это как раз одно из возражений, на которое указал Пол Миллер в своей статье Recursive make considered harmful почти 20 лет назад.

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

+0

Отлично читал. Использование одного make-файла кажется хорошо продуманным решением. – imagineerThat

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