経緯
意外と苦労しました(笑)ので、今回も情報共有のために記事にいたします。Visual Studio2017でC++を使いつつ、git for Windowsでソース管理をしているのですが、他のプロジェクトに使うことを前提として、どのgitのコミットのものなのかを一々手動で入力するのではなく、ビルド時に自動的に設定したい、と思って色々と試しました。
バージョン情報の設定ですが、テキストファイルだけを自動的に作成し、実行時に読み込むという方法もありますが、これですとテキストファイルも実行ファイルに添付する手間が増えます。そこで、includeファイルとしてテキストを読み込んでしまう方針で行きました。参考にさせていただいたサイトを最後に引用させていただいております。
埋め込むgitの情報
まず、埋め込むgitの情報なのですが、現在のハッシュ
git rev-parse HEAD
その短縮版
it rev-parse --short HEAD
さらにコミットメッセージ
git log -n 1
を埋め込むなどなど、いくらか方針があると思います。今回は、一番最近のタグからのコミット情報を採用しました。なので、コマンドとしては
git describe --tags
になります。
Visual Studioの設定
プロジェクトのプロパティの中に、「ビルドイベント」という項目があります。その中の「ビルド前のイベント」のところに設定しました。この設定で結構試行錯誤をしたのですが、最終的にはコマンドラインのところに
ECHO INLINE_TEXT( > VERSION & git describe --tags >> VERSION & ECHO ) >> VERSION
のように設定することで動いております。3つのコマンドを「&」で繋げております。最初に「INLINE_TEXT(」までをファイル「VERSION」にリダイレクトで書き込んでおります。次にgit describeの結果を同じ「VERSION」に追記し、最後に「)」を閉じています。ECHOだと改行が入ってしまうのですが一応問題なく動いておりますし、また2番目のgitの結果を追記する部分でも改行が入りますので、この辺りは仕方ないものと思います。動かなくなった場合、4番目のコマンドとして、テキストファイルから改行を除く処理を追加する、という方針も取れると思います。
また一度少し変更をしてビルドをしてみて、「VERSION」ファイルができていることを確認してみてください。場所はソースファイルと同じ階層にあるはずです。
INLINE_TEXT( hoge-12345-hashedbeef )
のようにできていれば大丈夫です(もちろん2行目は適当ですw)。
読み込むソース側の設定
まず、プリプロセッサでのオペランドも文字列化を行うマクロをファイルの先頭の方で定義しておきます。
#define INLINE_TEXT(str) #str
その後に、
const char * version = #include "VERSION" ;
のように記述いたしますと、git describeの内容が文字列としてプログラム中に埋め込むことができました。
コメント