我想使用以下配方使用 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, , %))' )。
有什么办法可以克服这个问题吗?
谢谢。
类似这样的问题时不时就会出现。简短的回答是 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)