我想使用以下配方使用GNU Make生成许多文件。
ina_as%.dat: ina_driver.m ina_as$(word 1,$(subst _epsi, , %)).m
echo "modelType = '$(word 1,$(subst _epsi, , $*))'; ofile = '$@'; epsi = '$(word 2,$(subst _epsi, , $*))';" | cat - $< | nohup matlab -nodesktop -nosplash
目标的格式为:ina_as%d_epsi%.2f.dat(例如ina_as1_epsi0.50.dat),第二个先决条件是ina_as%dm(例如ina_as1.m)(注意,第二部分是_epsi%。 2f必备文件名中缺少。)
我已经为隐式规则尝试了几种组合($ ,$$ ,$(eval $ *)等),但它仍然不起作用。我想这可能是因为Make无法理解依赖关系定义中的函数('$($ 1,$(subst _epsi,,%))'。
有什么方法可以解决这个问题吗?
感谢。
答案 0 :(得分:2)
这样的问题不时出现。简短的回答是,Make无法以干净的方式做到这一点;文本操作语句在执行任何规则之前扩展(即在%
之前有任何值),而Make不能很好地处理通配符(或正则表达式)。
更长的答案是它可以完成,但只能使用一个或另一个kludge。如果您的Make版本支持SECONDEXPANSION,您可以这样做:
.SECONDEXPANSION:
ina_as%.dat: ina_as$$(word 1,$$(subst _, ,%)).m
@echo "modelType = '$(word 1,$(subst _epsi, , $*))'; ofile = '$@'; epsi\
= '$(word 2,$(subst _epsi, , $*))';" | cat - $< | nohup matlab -nodesktop\
-nosplash
如果没有,你可以诉诸递归Make(有时候很有用,无论他们说什么):
ina_as%.dat :
@$(MAKE) dummy MODELTYPE=`echo $* | sed "s/_.*//"` EPSI=`echo $* | sed \
"s/.*_epsi//"`
dummy: ina_as$(MODELTYPE).m
@echo "modelType = $(MODELTYPE); ofile = ina_as$(MODELTYPE)_epsi$(EPSI)\
; epsi = $(EPSI);" | cat - ina_as$(MODELTYPE).m | nohup matlab -nodesktop\
-nosplash