こんにちは!ミヤチです!!
今日はビルド時にSubversionのリビジョン番号を実行バイナリに埋め込もう!
…という話をしたいと思います。
さて、そもそもなんで実行バイナリにリビジョン番号を埋め込もうかと思ったかなのですが、ゲーム開発中は様々な部門から実装要望やバグの報告がプログラマに対し投げられてきます。
それらを対応し報告したものの「出来てないじゃないか!」と言われることがあります。
…ッ!?なぜ…ッッッ!!??
それは…その実装を確認した人が実装タイミングより前にビルドされたアプリケーションで動作確認を行なってしまうことがあるためです。
(もちろん確認する側と対応する側で認識の相違があり、異なった実装をしてしまうこともありますが…)
なぜそんなことが発生してしまうかというと、対応を行なったプログラマがいつ修正したかを伝えていないがために、確認を行う側は取り敢えず手に入れることができるビルド済みのアプリケーションで動作確認を行ってしまうためです。
それを防ぐには実装した側が“いつ”実装したものかを確認する側にも正確に伝えることができれば、確認する側も“いつ”なら望んだ対応がなされているかを知ることが出来るわけです。
ランカースではSubversionでバージョン管理を行なっているため“いつ”という情報はリビジョン番号を伝えれば実装タイミングを確認する側に伝えることが出来ます。
さらにそれが実行バイナリに埋め込まれていれば現在実行しているアプリケーションは対応が成されたリビジョンのものかどうかを知ることが出来ます。
ということで、今回は以下の2つのことを行いたいと思います。
①ビルド前にリビジョン番号が記載されたヘッダファイルを出力
②そのファイルをインクルードし、実行中に表示をおこなう
ヘッダファイルの出力ですが、これはTortoiseSVNをインストールした際に合わせてインストールされるSubWCRevを使用します。
これは、特定のファイルに記載されたキーワードを置換して別のファイルに出力するというツールで以下の記法で使用することが出来ます。
SubWCRev [チェックする作業コピーのパス] [置換元のファイルパス] [出力先のファイルパス] [オプション]
この置換されるキーワードの詳細に関してはこちらに記載されていますので今回扱う以外のキーワードに関してはリンク先を参照してください。
今回はリビジョン番号が取得したいため「$WCREV$」キーワードと、最終コミット日時を取得する「$WCDATE$」キーワードを使いたいと思います。
まずあらかじめ別のテキストファイルに以下の記述を行います。
1 2 3 4 5 6 7 |
#ifndef __PG_CODE_REVISION_H__ #define __PG_CODE_REVISION_H__ #define CURRENT_SVN_REVISION_STR "$WCREV$" #define CURRENT_SVN_COMMIT_TIME_STR "$WCNOW$" #endif // __PG_CODE_REVISION_H__ |
今回は仮にこれを「version_src.txt」とし、出力先を「version.h」とします。
今回はVisualStudioのC++プロジェクトと想定させていただきますが、
プロジェクトのプロパティから[構成プロパティ]→[ビルドイベント]→[ビルド前イベント]と進み、コマンドラインにSubWCRevのコマンドを記述します。
ソリューションファイルのあるディレクトリを作業ディレクトリ、
出力元となる「version_src.txt」も同のディレクトリ、
出力先となる「version.h」は1つ下の「code」ディレクトリにあるとすると
以下のようになります。
1 |
SubWCRev $(SolutionDir) $(SolutionDir)\version_src.txt $(SolutionDir)\Code\version.h |
これにより出来上がった「version.h」をインクルードしCURRENT_SVN_REVISION_STRを出力するコードを記述すれば、この実行バイナリが実行した際に相手方へいつのリビジョンのアプリケーションかを伝えることが出来ます。
下記のように起動時に目に入るところなどに表示して置くと、より確認しやすいのではないかと思います。
ただ、この「version.h」をコミットしてしまうのは避けたほうがよいかと思います。
何故かと言いますと、「version.h」の生成はビルド前イベントに仕込んだ都合、全てのプログラマの環境で変更が発生します。
そのためリビジョン番号違いによる自動マージや競合の発生に繋がってしまうという問題が発生しえます。
それを避けるためにも「version.h」自体は無視リストに登録し、コミットしないようにしておくと良いかと思います。
私の記事はこんな感じで趣味以外の話は、開発環境整備等の話をしていければと思います!
それでは!