在make中重新评估通配符

时间:2017-02-01 14:55:57

标签: android-ndk gnu-make

在我的Makefile中,我想检查某个文件是否存在,执行某些操作,然后再次检查。使用gnu make,我不能。这是一个简单的例子:

$(info $(wildcard OK))
$(shell touch OK)
$(info $(wildcard OK))

如果我运行make一次,我会看到两个空行。如果我再次运行make,则这两行都是OK

我想,也许$(eval)会让我得到更新的答案。可惜的是,

$(eval $$(info $$(wildcard OK)))

产生相同的答案,就好像make有一些方法可以在开始评估其他命令之前预测所有通配符计算。

我需要这个来满足Android NDK执行的检查:我必须动态生成prebuilt shared library

1 个答案:

答案 0 :(得分:2)

这不起作用,因为为了提高性能,make会维护目录内容的内部缓存。目前,只有当make运行规则时才更新缓存:然后将定义要创建的规则的目标添加到缓存中。在您的情况下,make无法知道文件系统已被修改,因此无法更新缓存。

你必须使用shell,而不是wildcard; shell不了解make的内部缓存:

$(info $(wildcard OK))
$(shell touch OK)
$(info $(shell [ -f OK ] && echo OK))

显然,这是一个虚假的例子,但我确定你的真实代码与此明显不同。

唯一的另一种选择是将您需要运行的命令转换为规则。但同样,由于这个问题与你真正想要做的事情几乎无关,我无法提出一个可以解决这个问题的解决方案。