Makefile 使文件匹配规则的通配符先决条件
我想将一些配方传递给一个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
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:使用这种方法,我不必更改跳过操作的部分。