Makefile 一个目标的回波
我有一个makefile,它在目录中查找.txt文件,并为每个文件生成其名称的回声Makefile 一个目标的回波,makefile,gnu-make,Makefile,Gnu Make,我有一个makefile,它在目录中查找.txt文件,并为每个文件生成其名称的回声 pchs := $(wildcard $(OUTPUT:%=%/*.txt)) txt: $(pchs) %.txt: echo $@ 但是,当我启动它时,make实用程序会返回我,对txt不做任何事情。为什么? EDIT1: 在回答了一些问题之后,我明白了我应该用makefile做什么。现在看起来是这样的: pchs := $(wildcard $(OUTPUT:%=%/*.txt)) .PHON
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
txt: $(pchs)
%.txt:
echo $@
但是,当我启动它时,make实用程序会返回我,对txt不做任何事情。为什么?
EDIT1:
在回答了一些问题之后,我明白了我应该用makefile做什么。现在看起来是这样的:
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
.PHONY : $(pchs)
txt: $(pchs)
%.txt:
@echo pch is '$<'
pchs:=$(通配符$(输出:%=%/*.txt))
.冒牌货:$(pchs)
txt:$(pchs)
%.txt:
@echo pch是“$,因为makefiles定义了您想要构建的内容。而且.txt文件已经存在,所以没有什么可做的
要解决这个问题,有很多种可能性,但是如果使用gnu make,至少应该查看.PHONY记录
您可以从txt记录中构建虚假内容,并将其标记为虚假。但是这样做可能更容易:
pchs := $(wildcard $(OUTPUT:%=%/*.txt))
txt:
for i in $(pchs) ; do echo $$i ; done
这是因为您在$(pchs)
中列出的每个.txt
文件都是最新的,Make决定不采取任何行动。
将它们添加到.PHONY
目标,以便在每次运行Make时强制重建它们:
.PHONY : $(pchs)
UPD。
还要检查$(pchs)
列表是否为空,可以按如下方式执行:
txt : $(pchs)
@echo pchs is '$^'
为什么make说没什么可做的?因为make计算目标的依赖关系,通常是文件目标。“txt”目标不生成任何文件
.PHONY用于不生成文件的目标,如干净的目标
这在这里应该起作用:
pchs:=$(通配符$(输出:%=%/*.txt))
.PHONY:txt
txt:$(pchs)
回音$@
但是,由于您只回显文件名,我猜您是在对这个输出进行后期处理。也许您可以在makefile中将此后期处理作为一个规则来表述?我将使用Bash来确定*.txt文件,而不是Make:
txt:
ls | grep -F '.txt'
您还可以将其用作模板,以创建一个更通用的目标,该目标将以特定扩展名回送目录中存在的任何文件
您可能希望目标是假的,因为它没有生成文件。尝试用显式的$(pchs)替换%.txt:
隐式规则:
.Hm,声明.PHONY:txt
?这是txt
依赖项,不应检查其物理存在性,因此应始终触发。所以我认为@JörgBeyer是对的。@dma_k,是的,事实上,你是对的,。txt
的假无论如何都是需要的。但是为了强制执行每个$(pchs)
的配方,即使它们是最新的,我们也需要将它们添加到.PHONY
。