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) で、2 番目の前提条件は ina_as%dm (例 ina_as1.m) です (注意、2 番目の部分 _epsi%.2f が必須ファイル名)。

暗黙のルール ( $ 、 $$、 $(eval $*) など) のいくつかの組み合わせを試しましたが、それでも機能しません。Make が依存関係定義の関数 ( '$(word 1,$(subst _epsi, , %))' ) を理解できなかったことが原因である可能性があると思います。

この問題を克服する方法はありますか?

ありがとう。

4

1 に答える 1

4

このような質問がときどき出てきます。簡単に言えば、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        

そうでない場合は、再帰的な 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 に答える