2011/06/03

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

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

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

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

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

で、今まさに

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

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

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

  1. #!/bin/sh  
  2.   
  3. echo "check file update!"  
  4.   
  5. makeOpt=$1  
  6.   
  7. # 作業ディレクトリ(衝突しない名前に)  
  8. workDir=autorun  
  9.   
  10. rm -rf $workDir  
  11. mkdir -p $workDir  
  12.   
  13. while [ 1 -eq 1 ]  
  14. do  
  15.  isMake=0  
  16.   
  17.  # 更新確認するファイルを、in のあとに並べる  
  18.  for file in *.cpp *.hpp Makefile tmp/*.cpp  
  19.  do  
  20.   backup=${workDir}/${file}  
  21.   if [ ! -e $backup -o $file -nt $backup ] ; then  
  22.    cp -f --parents $file ${workDir}/  
  23.    isMake=1  
  24.   fi  
  25.  done  
  26.   
  27.  if [ $isMake -eq 1 ] ; then  
  28.   make $makeOpt  
  29.   if [ $? -eq 0 ]  
  30.   then  
  31.    echo success!  
  32.    # 成功時の処理をここに書く  
  33.   else  
  34.    echo failed!  
  35.    # 失敗時の処理をここに書く  
  36.   fi  
  37.  fi  
  38.   
  39.  sleep 1  
  40. 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 件のコメント:

コメントを投稿