今日は、makeを使ってTDDするときに、
- コード変更
- いちいち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 件のコメント:
コメントを投稿