当规则创建应修改通配符扩展行为的文件时,我无法理解Makefile如何处理变量扩展。
例如,我有以下Makefile:
TEXT_FILES = $(wildcard *.txt)
all: create test
create:
@touch hello.txt
test:
@printf "The files are $(TEXT_FILES)\n"
运行make
时我期望获得的是
文件是hello.txt
因为TEXT_FILES
应该在调用时进行评估,而不是在定义时进行评估。但是,我实际上得到了(运行两次)
文件是(第一次执行时变量为空)
文件是hello.txt(下次找到)
我如何获得所需的行为?
答案 0 :(得分:1)
此行为是make内部缓存的结果。出于性能原因,make将根据之前的内容以及它已知的更改(由于已调用的规则)缓存它认为是真实的文件系统的状态。
wildcard
等功能会查询内部缓存(如果可用)。
但是,在您的情况下,您并未描述要制定的规则的实际行为:您没有告诉您该规则会生成额外的文件。因此,不会更新其缓存,wildcard
函数永远不会找到此秘密文件。
你不能准确地说出你想要做的事情,但为什么不使用贝壳的通配符而不是make wildcard
函数? shell显然不了解make的内部缓存:
TEXT_FILES = *.txt
all: create test
create:
@touch hello.txt
test:
@echo The files are $(TEXT_FILES)