回显一个目标

时间:2012-02-04 20:23:05

标签: makefile gnu-make

我有一个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没有帮助我制作的结果是一样的。

4 个答案:

答案 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)

UPD。

同时检查$(pchs)列表是否为空,可以按如下方式进行:

txt : $(pchs)
    @echo pchs is '$^'

答案 3 :(得分:0)

我会使用Bash来确定* .txt文件,而不是Make:

txt:
        ls | grep -F '.txt'

你也可以使用它作为模板来制作一个更通用的目标,即回复目录中存在特定扩展名的任何文件。

你可能希望目标是PHONY,因为它没有制作文件。