Makefile 一个目标的回波

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

我有一个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 '$<'
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