GNU MAKE:依赖项中的函数

时间:2013-09-09 17:35:05

标签: makefile

我想使用以下配方使用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,,%))'。

有什么方法可以解决这个问题吗?

感谢。

1 个答案:

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