Makefile 使文件匹配规则的通配符先决条件

Makefile 使文件匹配规则的通配符先决条件,makefile,Makefile,我想将一些配方传递给一个makefile,比如comp1.mt comp2.mt comp3.mt,并让makefile将它们转换为一个mt列表(也可以是mt.compN)以批量运行它们 %.mt: @echo $* >> list_of_mts.txt mt: %.mt @cat list_of_mts.txt 我想以任何顺序将这些配方传递到makefile,因此调用make comp1.mt comp2.mt mt的特定情况是不可取的。我不理解为什么需要在ma

我想将一些配方传递给一个makefile,比如
comp1.mt comp2.mt comp3.mt
,并让makefile将它们转换为一个mt列表(也可以是
mt.compN
)以批量运行它们

%.mt:
    @echo $* >> list_of_mts.txt

mt: %.mt
    @cat list_of_mts.txt

我想以任何顺序将这些配方传递到makefile,因此调用
make comp1.mt comp2.mt mt
的特定情况是不可取的。

我不理解为什么需要在makefile中实现此功能,但您可以:

MT_TARGETS:=$(filter %.mt,$(MAKECMDGOALS))

.PHONY: $(MT_TARGETS)
$(MT_TARGETS):
        @echo $@ | sed -e "s:.mt$$::" >> list_of_mts.txt

mt: $(MT_TARGETS)
        @cat list_of_mts.txt
测试:

$ make mt comp1.mt comp2.mt comp3.mt
comp1
comp2
comp3
make: `comp1.mt' is up to date.
make: `comp2.mt' is up to date.
make: `comp3.mt' is up to date.
这是使用特殊变量
MAKECMDGOALS

注意:_mts.txt的列表将无限增长


注2:并行执行时,写入_mts.txt的列表_是不安全的(_mts.txt的列表_文件可能会损坏)。

为什么决定在此处使用makefile?简单的一行脚本似乎和您想做的一样:
echo“$@”|tr”“”\n“>list_of_mts.txt&&cat list_of_mts.txt
我不理解您问题的最后一句话:“我想以任何顺序将这些配方传递给makefile,因此调用
make comp1.mt comp2.mt
的具体情况是不可取的。”。你能解释一下吗?@RenaudPacalet如果我在本地调用
make comp1.mt comp2.mt mt
,它似乎可以在我退出时工作,首先调用
compN
,然后调用
mt
,但这是因为我在参数中给出的顺序。@Kuchara我知道我可以,但在这一点上,我很好奇是否有办法让这样的事情发生。ATM我正在向makefile传递一个包含组件列表的变量。@nemo9955抱歉,您想要什么还不清楚。你想让mt做所有的事情吗?如果是,为什么要调用
make comp1.mt comp2.mt mt
,而不仅仅是
make mt
?您的Makefile有几个问题,但由于您的实际目标不明确,很难提出解决方案。谢谢!实际上我不需要一个列表作为文本,
$(mtu目标):和列表由
MT_-TARGETS_-RAW:=$(subst.MT_-comp,,$(filter%.MT_-comp,$(MAKECMDGOALS))
组成,在
MT:
中,我只使用
@echo$(MT_-TARGETS_-RAW)
,但这基本上与脚本
echo“$@”\tr”“\n”\n“;sed-ne”s:.MT-comp$:p>相同。如果你能做一些更简单的事情,就去做吧!:-)为了防止并行问题,我做了
@mkdir-p all\u valit\u mts/$(subst.mt\u comp,,$@)
,生成文件是
mt:| clean\u list\u dirs$(mt\u TARGETS)
。我的想法是,我想把它们都保留为菜谱,因为我有一种机制可以覆盖特定的菜谱,比如
comp1.mt_comp: