几天前我发现了 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
目标之间重新组织。有人可以解释一下其中的奥秘吗?
$(file ...)
是一个 make 函数。 rm
是一个 shell 命令。
当 make 准备调用 shell 来运行配方时,它将首先扩展配方中的所有变量和函数。由于
$(file ...)
是一个 make 函数,因此此时会调用它。
然后在展开所有变量和函数之后,将配方交给 shell,然后 shell 运行 shell 命令,如
rm
等。
因此,如果您有
rm
,则首先会因 $(file ...)
而创建文件,然后您的脚本会因 rm
而删除它。