摘要:
我在类 unix 系统上使用 GNU Make (3.81),我遇到了一个问题,即该$(wildcard, pattern)
函数无法找到由(可能/显然?)先前执行的配方生成的文件,而其他程序(例如 ls)能够验证它的存在。我想知道为什么通配符函数没有返回任何内容,它何时被扩展(到空字符串),以及我如何让它找到生成的文件。
测试用例:
下面的测试用例说明了这个问题。
生成文件内容:
.PHONY: build clean
test:
@echo "Creating test file 'test'."
@echo "this is a test file" > test
build: test
@echo "Directory contents:"
@ls
@echo "Test file contents:"
@cat test
@echo "Wildcard output:"
@echo $(wildcard test)
clean:
@rm -f test
运行 makefile 两次(然后清理)表明只有在第二次运行时才会检测到创建的文件。
输出:
Creating test file 'test'.
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard output:
Directory contents:
makefile test
Test file contents:
this is a test file
Wildcard output:
test
重现:
将生成文件保存在一个空目录中,然后运行“make build;make build;make clean”。
研究:
处理目标的先决条件的顺序与它们在冒号后面的列表中出现的顺序无关,因此如果要定义它们的顺序,必须引入显式的先决条件间依赖关系处理。
但是,我认为我不能再剥离依赖项了。build
取决于test
,并且test
对应于一个不存在的文件,它是由它的配方生成的。我想它会在build
处理配方时出现。
根据我对make如何解析makefile的了解,配方中的通配符函数在处理之前不应扩展。但是,我清楚地看到内置 make 功能的输出与通过 shell 访问的常用实用程序的输出之间存在差异,所以这个假设可能是错误的,但我没有遇到任何关于应该做什么的好的解释发生在这里,甚至在 GNU make 手册中也没有。
注意这个问题的目的只是为了了解与这个问题相关的通配符函数的工作原理;有一个实际用例,我从中提炼出这个淡化版本,但我对这个案例更感兴趣。