То, что GNU устанавливает требуемые цели, объявленные как .PHONY
, должно быть явным, как уже было указано в других ответах, что также предоставило некоторые средства для этого.
В этом дополнительном ответе я хотел бы добавить альтернативу, которая, как я тестировал, сочетает в себе «фальшивое» поведение, то есть то, что цели запускаются каждый раз, независимо от того, существуют ли файлы с одинаковым именем (они игнорируются).Альтернатива выглядит следующим образом:
.PHONY: phony_explicit
phony_explicit:
%.subdir: phony_explicit
$(MAKE) -C src $*
$(MAKE) -C dict $*
Она работает на предпосылке, что хотя только явные цели могут быть установлены как .PHONY, что бы ни зависело от явной ложной цели, само по себе наследует многое (насколько мне известно, все)фальшивые атрибуты.Неявная цель, т. Е. Цель сопоставления с образцом, такая как %.subdir
выше, аналогична тому, как если бы она была добавлена к .PHONY
(что невозможно, поскольку она сама по себе не является явной), но при этом становится фальшивой благодаря своей пререквизитной лжи phony_explicit
.
Это сводится к тому, что каждое правило - также неявное через сопоставление с образцом - которое имеет в своих предварительных условиях явную фальшивую цель (т. Е. Цель, добавляемую к .PHONY
), через эту зависимость также выполняется в фальшивомстиль (каждый раз, безусловно, в файловой системе, ошибочно имеющей файл с совпадающим именем).
Действительно, в документации GNU упоминается FORCE
target , который в некоторых версиях GNU делаетне предлагать цель .PHONY
частично эмулирует поведение .PHONY
.Альтернатива, представленная здесь, использует это FORCE
target approuch, но поскольку используется GNU make, она также устанавливает цель FORCE
как .PHONY
, избегая потенциальных конфликтов с реально существующими файлами с тем же именем.
С этим решением даже
touch clean.subir; make clean.subdir
даст желаемый вызов
make -C src clean
make -C dist clean
. Что может быть потенциальным преимуществом этой альтернативы, так это то, что она не нуждается вявное объявление clean.subdir
и all.subdir
, но на самом деле используется неявное %.subdir
сопоставление с образцом.