現在抱えている定型業務の中に、不特定数の多数の入力ファイルから出力を得なければならないプロセスがあります。makeプログラムを使って時間やコンピュータ資源を無駄にすることなく出力を得ることはできないか考えています。
###前提・実現したいこと
手元に以下の3パターンのいずれかに合致するファイル名を持つ多数のファイルがあります。
aX_bY.txt aX.txt bY.txt
ここでX,Yは任意の数字になります。どのような数字がくるかはケースバイケースです。たとえば次のような感じになっています。
a1_b1.txt a1_b20.txt a2_b3.txt a3_b20.txt a3_b35.txt a1.txt a2.txt a3.txt b1.txt b20.txt b3.txt b35.txt
これら3タイプのファイルを入力元とした計算を行い結果を標準出力に書き出すプログラム(prog)があり、これを用いて、
prog a1_b1.txt a1.txt b1.txt > output_a1_b1.txt prog a1_b20.txt a1.txt b20.txt > output_a1_b20.txt prog a2_b3.txt a2.txt b3.txt > output_a2_b3.txt ...(以下同文) finalprog output_*.txt > final.txt
のような感じで出力ファイルを作らなければなりません。
入力ファイルは時々更新されたり追加されたりします。それに応じてoutput_*.txtもfinal.txtも再作成される必要があります。
ここで、progの実行には非常に時間がかかるので、入出力ファイルの更新時間をチェックして再作成が必要な組み合わせについてのみ実行したいのです。
こうした処理をうまくさばくMakefileの書き方はないものでしょうか?
###試したこと
output_*.txtの更新にあたって、aX.txtやbY.txtの存在を考慮しないでよいなら、
Makefile
1output_%.txt : %.txt 2 prog $^ > $@
のようなパターンルールを一つ書けばいいと思いますが、本件では2種類のワイルドカードが出てくるのでこれは使えません(と理解しています)
今は、以下のような内容のMakefileをperlで都度生成してMakeを呼び出すということをやっています。
Makefile
1output_a1_b1.txt : a1_b1.txt a1.txt b1.txt 2 prog $^ > $@ 3output_a1_b20.txt : a1_b20.txt a1.txt b20.txt 4 prog $^ > $@ 5... 6以下延々とすべての組み合わせについて続く。 7
実際には上でprogを呼び出すとした箇所はもっと複雑で、Makefileも膨大なサイズになってしまっています。
いちどMakefileができてしまえば一応動くのですが、こんご処理過程の変更が加わる可能性もあり、この泥臭い方法ではその見直しも面倒なものになりそうだと危惧しています。
###補足情報(言語/FW/ツール等のバージョンなど)
ubuntu 14.04
GNU make 3.81
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。