Android ndk 重新评估make中的通配符

Android ndk 重新评估make中的通配符,android-ndk,gnu-make,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在开始

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

$(info $(wildcard OK))
$(shell touch OK)
$(info $(wildcard OK))
如果我运行一次
make
,我会看到两行空行。如果我再次运行
make
,两行都是
OK

我想,也许
$(eval)
会让我得到最新的答案。唉,

$(eval $$(info $$(wildcard OK)))
生成相同的答案,就好像
make
在开始计算其他命令之前,有某种方法可以预测所有通配符计算


我需要它来满足Android NDK执行的检查:我必须动态生成一个。这无法工作,因为为了性能,make维护目录内容的内部缓存。当前,该缓存仅在make运行规则时更新:然后将定义规则要创建的目标添加到缓存中。在您的情况下,make无法知道文件系统已被修改,因此不会更新缓存

您必须使用shell,而不是
通配符
;shell不知道make的内部缓存:

$(info $(wildcard OK))
$(shell touch OK)
$(info $(shell [ -f OK ] && echo OK))
很明显,这是一个虚假的示例,但我相信您的真实代码与此明显不同


另一种选择是将需要运行的命令转换为规则。但是,同样,由于这个问题与您真正想做的事情没有什么关系,我不能建议一个解决方案来解决这个问题。

这不可行,因为出于性能考虑,make维护目录内容的内部缓存。当前,该缓存仅在make运行规则时更新:然后将定义规则要创建的目标添加到缓存中。在您的情况下,make无法知道文件系统已被修改,因此不会更新缓存

您必须使用shell,而不是
通配符
;shell不知道make的内部缓存:

$(info $(wildcard OK))
$(shell touch OK)
$(info $(shell [ -f OK ] && echo OK))
很明显,这是一个虚假的示例,但我相信您的真实代码与此明显不同


另一种选择是将需要运行的命令转换为规则。但是,同样,由于这个问题与您真正想做的事情没有什么关系,我不能建议一个解决方案来解决这个问题。

我的目标是利用Android NDK中的脚本构建一个我必须自己构建的库。NDK框架使用$(通配符)函数来验证库文件是否存在,但我想自己构建它;它是在第一次为该目录计算
$(通配符)
函数时创建的。这可能足以让我产生一个解决方法。我将做与您的示例完全相反的事情:首先,使用
$(shell)
,而不涉及缓存;然后,我将让NDK运行通配符,但我的逻辑将有机会准备事后真相。只要您确定在执行此操作之前没有任何东西尝试缓存目录,这将起作用。我觉得有点摇摇晃晃,但……是的,这是一个真正的问题。但在我的例子中,NDK将查找文件的目录,在我明确指出它之前,它是不可能被绊倒的。我的目标是利用Android NDK中的脚本创建一个我必须自己构建的库。NDK框架使用$(通配符)函数来验证库文件是否存在,但我想自己构建它;它是在第一次为该目录计算
$(通配符)
函数时创建的。这可能足以让我产生一个解决方法。我将做与您的示例完全相反的事情:首先,使用
$(shell)
,而不涉及缓存;然后,我将让NDK运行通配符,但我的逻辑将有机会准备事后真相。只要您确定在执行此操作之前没有任何东西尝试缓存目录,这将起作用。我觉得有点摇摇晃晃,但……是的,这是一个真正的问题。但在我的例子中,NDK将在其中查找文件的目录,在我明确指出它之前,它是不可能被绊倒的。这在4.2.1中运行良好:-)查看了git日志,但找不到冒烟的枪。在3.81中确实失败了。在3.82、4.0、4.1、4.2和4.2.1中工作。是的,我知道,必须多出去。这在4.2.1中运行良好:-)查看了git日志,但找不到冒烟的枪。在3.81中确实失败了。在3.82、4.0、4.1、4.2和4.2.1中工作。是的,我知道,我得多出去。