我有一个makefile,它在目录中查找.txt文件,并且每个文件都会回显它的名称。
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
txt: $(pchs)
%.txt:
echo $@
但是当我启动它时,make实用程序返回我没有为txt做任何事情。为什么呢?
EDIT1:
经过一些回答后,我明白了我应该用makefile做什么。现在它看起来像这样:
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
.PHONY : $(pchs)
txt: $(pchs)
%.txt:
@echo pch is '$<'
但是.PHONY没有帮助我制作的结果是一样的。
答案 0 :(得分:1)
为什么make说,没有什么可做的?因为make计算目标的依赖关系,通常是文件目标。并且“txt”目标不生成文件。
.PHONY用于生成没有文件的目标,就像清理目标一样。
这应该有效:
pchs:= $(通配符$(OUTPUT:%=%/ *。txt))
.PHONY:txt
txt:$(pchs)
echo $ @
但是,既然你只回显文件名,我想你是在处理这个输出。也许您可以在makefile中将此后处理作为规则来制定?
答案 1 :(得分:0)
因为makefile定义了你想要构建的内容。而且.txt文件已经存在,所以无所事事。
要解决这个问题,有很多种可能,但如果至少使用gnu-make,你应该查看.PHONY记录。
您可以使用txt记录构建虚假内容并将其标记为虚假。但是......这样做可能更容易:
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
txt:
for i in $(pchs) ; do echo $$i ; done
答案 2 :(得分:0)
这是因为您在.txt
中列出的每个$(pchs)
文件都是最新的,并且Make决定不采取任何措施。
将它们添加到.PHONY
目标,以便在每次运行Make:
.PHONY : $(pchs)
同时检查$(pchs)
列表是否为空,可以按如下方式进行:
txt : $(pchs)
@echo pchs is '$^'
答案 3 :(得分:0)
我会使用Bash来确定* .txt文件,而不是Make:
txt:
ls | grep -F '.txt'
你也可以使用它作为模板来制作一个更通用的目标,即回复目录中存在特定扩展名的任何文件。
你可能希望目标是PHONY,因为它没有制作文件。