makeコマンドを使ってみよう #5
はじめに
makeは、ソースコードのタイムスタンプに基づいて、ターゲットを自動的に作成するプログラムです。この仕組みは、これまで説明してきたようなプログラムのビルド以外にも、何らかのファイルから別のファイルを作成する用途全般に適用することができます。ここでは、データファイルからグラフを生成する例を紹介します。
処理の流れ
次の図のように、データファイル(raw.log)に含まれる情報からグラフ(chart.png)を作成します例を考えます。グラフ作成のツールとしてgnuplotを利用します。gnuplotは、データファイルからグラフを作成する機能を持ちますが、データファイルは特定の形式に整形されている必要があります。データファイルの例およびプロットの方法は、このドキュメントのp81「データファイルの例」節などを参照してください。
parse.pyは、raw.logをgnuplotで使用できる形式のファイル(parsed.dat)に変換します。この例では、Pythonのプログラムですが、もちろん、他の言語で作成することも可能です。簡単な整形なら、sedやawkを組み合わせてもよいでしょう。
mkchart.gpは、gnuplotのコマンドを列挙したファイルです。gnuplotはコマンドラインでインタラクティブにグラフの作成を行うこともできますが、本稿では自動でグラフを作成したいので、グラフの範囲、表示色、線の種類、データファイル名、出力グラフのファイル名などを設定するためのコマンドをこのファイルに記述します。
Makefile例
上記のフローを実現するMakefileの例がこちらです。
chart.png: parsed.dat mkchart.gp
gnuplot -e "load 'mkchart.gp'"
parsed.dat: raw.log parse.py
parse.py $< > $@
いくつかポイントがあります。
- 最終作成ファイル(chart.png)のルールを一番上に記述
- Makeはデフォルトで、一番上に書かれたルールを実行するからです。これまで説明したようにそれに必要なファイルがあれば、それ以降に書かれたルールを参照して作成します
- プログラムとスクリプトの両方を依存ファイルとして列挙
- 入力データとその処理方法のどちらか一方でも変更された場合、再度、ファイルの作成を行うためです
- gnuplotの-eオプションとloadコマンドを利用することで、自動的にファイルを作成
参考:mkchart.gpのシンプルな例
実際には、グラフ範囲や線や点の色、軸ラベルなどを設定することになるでしょう。それらの詳細についてはgnuplotのマニュアルを参照ください。
set terminal png
set output 'chart.png'
plot 'parsed.dat' with lp