不要为虚假目标执行配方

Cra*_*aig 3 makefile

考虑到PHONY目标的GNU make手册中的这段摘录:

完成后,make clean' will run the commands regardless of whether there is a file named清理'.

为什么我没有看到我的食谱被执行,事件虽然在调试输出中说它必须重新制作这些目标?这是一个示例makefile来演示该问题:

all:
    @echo Rule to build 'all'

.PHONY: clean a.clean b.clean
clean: a.clean b.clean
    @echo Cleaning toplevel

%.clean:
    @echo Cleaning $*
Run Code Online (Sandbox Code Playgroud)

这是输出 - 注意没有提到 Cleaning $*

make: Entering directory `/tmp'
Cleaning toplevel
make: Leaving directory `/tmp'
Run Code Online (Sandbox Code Playgroud)

以下是来自的输出-d:

Considering target file `clean'.
 File `clean' does not exist.
  Considering target file `a.clean'.
   File `a.clean' does not exist.
   Finished prerequisites of target file `a.clean'.
  Must remake target `a.clean'.
 Successfully remade target file `a.clean'.
  Considering target file `b.clean'.
   File `b.clean' does not exist.
   Finished prerequisites of target file `b.clean'.
  Must remake target `b.clean'.
  Successfully remade target file `b.clean'.
 Finished prerequisites of target file `clean'.
Must remake target `clean'.
Run Code Online (Sandbox Code Playgroud)

Bet*_*eta 6

手册的同一部分:

由于它知道虚假目标没有命名可以从其他文件重新创建的实际文件,因此跳过对虚假目标的隐式规则搜索(请参阅隐式规则).

所以,是的,请知道它必须"封神榜" a.cleanb.clean,但在寻找规则这样做的时候,它不会考虑你的方式规则.它找不到这些目标的配方,所以它耸耸肩,考虑完成的工作并继续前进.

您可以通过使模式规则成为静态模式规则来解决此问题:

a.clean b.clean : %.clean :
    @echo Cleaning $*
Run Code Online (Sandbox Code Playgroud)