1

我想使用以下配方使用 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 无法理解依赖定义中的函数( '$(word 1,$(subst _epsi, , %))' )。

有什么办法可以克服这个问题?

谢谢。

4

1 回答 1

4

诸如此类的问题时不时出现。简短的回答是 Make 根本无法以干净的方式做到这一点。文本操作语句在执行任何规则之前扩展(即 before%有任何值),并且 Make 不能很好地处理通配符(或正则表达式)。

更长的答案是它可以做到,但只能依靠一种或另一种手段。如果你的 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
于 2013-09-09T20:43:46.450 回答