GNU MAKE:依赖项中的函数

Tom*_*mas 1 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
Run Code Online (Sandbox Code Playgroud)

目标的格式为 --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, , %))' )。

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

谢谢。

Bet*_*eta 6

类似这样的问题时不时就会出现。简短的回答是 Make 根本无法以干净的方式做到这一点;文本操作语句在执行任何规则之前展开(即之前%有任何值),并且 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        
Run Code Online (Sandbox Code Playgroud)

如果没有,你可以求助于递归 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
Run Code Online (Sandbox Code Playgroud)