2011/06/03

makeをファイル更新のトリガで自動実行

今日は、makeを使ってTDDするときに、

  1. コード変更
  2. いちいちmake -> エンター(ターン ビンゴだ!)

ってやるのが、結構めんどくさく感じてまして。

求めてる動きは、ソース変更したら、勝手に結果でねぇかな と思ってたんですよね。

で、今まさに

  • 開発言語 C++
  • Cygwinで開発中
  • GoogleTest と GoogleMock

で、結局シェルスクリプトで実現することにしました。(いろんなアドバイスもらったので、それに関しては後述します)

まずシェルスクリプトです

#!/bin/sh

echo "check file update!"

makeOpt=$1

# 作業ディレクトリ(衝突しない名前に)
workDir=autorun

rm -rf $workDir
mkdir -p $workDir

while [ 1 -eq 1 ]
do
isMake=0

# 更新確認するファイルを、in のあとに並べる
for file in *.cpp *.hpp Makefile tmp/*.cpp
do
backup=${workDir}/${file}
if [ ! -e $backup -o $file -nt $backup ] ; then
cp -f --parents $file ${workDir}/
isMake=1
fi
done

if [ $isMake -eq 1 ] ; then
make $makeOpt
if [ $? -eq 0 ]
then
echo success!
# 成功時の処理をここに書く
else
echo failed!
# 失敗時の処理をここに書く
fi
fi

sleep 1
done

このスクリプトのいいところ

  • スクリプトの第一引数で make の引数を指定できるので、モジュールごとに実行しておくことが可能
  • makeとテストが両方成功した場合の判断ができるので、シェルスクリプトの編集で成功時にコミットとかできる(と思う)
  • 後片付けは、作業ディレクトリを消すだけ(.gitignore とかに指定しておくとよさそう)
  • 使うときはシェルスクリプトをmake用のディレクトリに置くだけ。

使うに当たって修正するところ

  • 自動でworkディレクトリとか作る(スクリプト内のworkDirで指定可能)ので、衝突しない名前にしておく
  • 更新チェック対象は、for の in のあとに付け加えるだけ
  • 成功時、失敗時(make失敗 or テスト失敗)の処理が必要な場合は、success と failed の場所を修正

という感じで。

実行は、

./autorun.sh make-option

で走りっぱなしになります。更新チェック対象のファイルが更新されたら、自動でmakeが始まります。

 

スクリプトの説明は以上で、ここから先は皆様からいただいたアドバイスですが

  • omakeでそんなことできたんじゃないかな(omake -p)
  • eclipse で 自動ビルド
  • make に仕込みをいれていく

なんて話をもらいました。

できない系の否定的な意見は、嫌なので、下のは自分の調査不足です。(実際にomakeもできたよーって話ももらいましたw)
んで、その上で僕の現状ですが

omakeは、もの凄いツールで、使いたくて頑張ったんですが、make -> ocaml -> flexlink -> アクセスが拒否されました。
というコンボが重なり、いまのところペンディングです(涙

omakeは、あとで使いたいのでLinux環境いったときに使いますね。

eclipseとgmakeについては、実際に「C++とGoogleTestのTDDをeclipseでどうか」を実験してたんですが、
あまりおいしくできなくて、やめていた経緯がありました。

  • eclipseが自動で作ってくれるmakeだと、実行ファイルが一つしかつくれなくて、うまくできなかった
  • makeを読込ませてやってみたが、makeターゲットの指定とかが意外と面倒

こんなところです。

とりあえずやりたいことはできた、よかった!

0 件のコメント:

コメントを投稿