Makefile`file`函数与`rm`的交互

问题描述 投票:0回答:1

几天前我发现了 Makefile

file
功能,它非常适合我需要做的事情......除了有一些我无法理解的东西。

参见这个简单的 Makefile:

FILENAME := test.txt
CONTENT  := whatever

all: clean
ifneq (1, $(CLEAN))
    rm -f $(FILENAME)
endif
    $(file > $(FILENAME),$(CONTENT))
    ls $(FILENAME)

clean:
ifeq (1, $(CLEAN))
    rm -f $(FILENAME)
endif

我在 Linux 和 Windows 上尝试了不同版本的

make
,并且我始终遇到这种(意外的)行为:

  • make CLEAN=1 all
    按预期生成文件
  • make CLEAN=0 all
    没有,尽管它(至少显然)经历了完全相同的步骤,只是在
    clean
    all
    目标之间重新组织。

有人可以解释一下其中的奥秘吗?

makefile gnu-make
1个回答
0
投票

$(file ...)
是一个 make 函数。
rm
是一个 shell 命令。

当 make 准备调用 shell 来运行配方时,它将首先扩展配方中的所有变量和函数。由于

$(file ...)
是一个 make 函数,因此此时会调用它。

然后在展开所有变量和函数之后,将配方交给 shell,然后 shell 运行 shell 命令,如

rm
等。

因此,如果您有

rm
,则首先会因
$(file ...)
而创建文件,然后您的脚本会因
rm
而删除它。

© www.soinside.com 2019 - 2024. All rights reserved.