当规则创建新文件时,使用通配符进行Makefile变量扩展

时间:2017-01-04 18:20:03

标签: makefile

当规则创建应修改通配符扩展行为的文件时,我无法理解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(下次找到)

我如何获得所需的行为?

1 个答案:

答案 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)