今日は、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 件のコメント:
コメントを投稿