Единственная причина, по которой, как написано, сделать даже прогоны, что правило вообще не связано с тем, что subsystem
и subdir
не совпадают.
Если в этом каталоге когда-либо создавался файл или каталог subsystem
, это правило перестало бы функционировать.
Если .PHONY: subsystem
1 были добавлены, что проблема была бы неподвижна и это правило будет всегда будет работать, когда перечисленные в командной строке (т.е. make subsystem
). (Как указано в комментариях .PHONY
является расширением GNU. Раздел, следующий за связанным разделом, обсуждает переносимую альтернативу. Хотя стоит отметить, что они не полностью идентичны тем, что .PHONY
имеет некоторые дополнительные преимущества и некоторые дополнительные ограничения.)
В любом из этих случаев цель subsystem
не обращает внимания на даты модификации чего-либо (так как в нем не указаны предварительные условия).
Для того чтобы цель зависела от изменений в файле makefile, вам необходимо указать makefile (ы) как предпосылки, как и все остальное (например, subsystem: subdir/Makefile
). Листинг это как .PHONY
, скорее всего, правильнее и более того, что вы хотите.
Нет, ничто в том, чтобы сама себя отслеживать, не является обязательным условием. Таким образом, флаг изменяется/etc. не запускайте перестройки. Однако есть способы сделать эту работу для make (они включают сохранение используемых флагов в файлах, которые сами являются предпосылками целевых объектов, использующих эти флаги, и т. Д.). Есть вопросы и ответы на SO о том, как это сделать (у меня нет их готовых от рук, хотя).
Другие инструменты действительно обрабатывают изменения флага автоматически. Я считаю, что инструменты Electric Cloud делают это. Я считаю, CMake делает. Могут быть и другие.
'.PHONY' полезен, но вы можете упомянуть, что это расширение в GNU make, но не присутствует вообще в make-реализациях. – Edward
Подождите, если вы упомянете make-файл как предварительное условие, не обнаружите, есть ли какие-либо изменения в этом целевом make-файле? Более конкретно, если вы изменяете флаг в рецепте целевого файла makefile, выполняет ли этот makefile полностью или просто вводит и выходит из него, фактически ничего не делая? (Вы подразумевали последнее). Это предполагает, что вся сборка завершена, и только один флаг в одном рецепте изменен (никаких целей в make-файлах не изменено, кроме целевого самого файла makefile. «Нет, ничто в том, чтобы заставить себя отслеживать не требуемые условия». Меня смутило. – imagineerThat
@imagineerThat Modify (для целей make) make-файл указан как предварительное условие, и он будет запускать любые цели, которые перечисляют его как предварительное условие, да. Как и в случае с обычным предварительным условием. make не достаточно умен, чтобы знать *, который * хотя (если в модифицированном make-файле есть несколько). Однако изменение флага не приведет к тому, что цели будут * использовать *, этот флаг будет перестроен, если ни одно из целевых предварительных условий не изменилось. –