Subversionでツリーのリビジョンをソースに書き込むには?
proj/ -+- include/ -+- hoge.h | +- fuga.h | `- defs.h `- src/ -+- main.cpp +- hoge.cpp `- fuga.cpp
こういう構成のソースツリーがあって main.o, hoge.o, fuga.o から a.out という実行ファイルを作るとする.この a.out が最新版のソースから作られていることを a.out --version
あたりを通じて確認したい.ソースツリーはSubversionでバージョン管理されており,各ファイルに svn propset svn:keywords Id
などすることは容易だ.しかし main.cpp で const char version_string[] = "$Id:$";
とするだけでは,hoge.cpp になされた重大な改変には気が付かない.かと言って各ファイルで同じことをやって
C:\build\proj\bin> a.out --version $Id: hoge.h 436 2010-7-29 17:54:20Z taro $ $Id: fuga.h 420 2010-7-25 12:23:12Z saburo $ $Id: defs.h 390 2010-7-15 11:10:47Z jiro $ $Id: main.cpp 447 2010-7-31 15:12:18Z taro $ $Id: hoge.h 438 2010-7-29 18:03:42Z taro $ $Id: fuga.cpp 420 2010-7-25 12:23:12Z saburo $
とかやっても逆に何も分からない... (ソースツリーは数百ファイルから構成されると思ってほしい)
こういうときは,コマンドラインなら親ディレクトリのバージョンを見れば大体は解決する:
C:\build\proj> svn info パス: . URL: http://svn.example.net/proj/trunk リポジトリのルート: http://svn.example.net/proj リポジトリ UUID: 74e08888-8a67-584b-a7ce-fbc74a52e606 リビジョン: 447 ←※※※ これ ※※※ ノード種別: ディレクトリ 準備中の処理: 特になし 最終変更者: taro 最終変更リビジョン: 240 最終変更日時: 2010-05-27 03:00:57 +0900
この情報を main.cpp 内の const char[] version_string
に自動で入れたい... どうするのがベストなのかなー.Makefile(もしくは,それ相当の何か)に
version_string.txt : svn info |egrep ^リビジョン |sed -re 's/(.*)/"\1"/' > $@
とか指定して, main.cpp では
const char version_string[] = #include "../../version_string.txt" ;
とかやればいいのかもしれないが...,grepとsedはWindowsマシンの場合どこから調達するんだ? とか色々と悩みは尽きない.(Cygwinは嫌だからMSYS*1で済ませるべきか... )
*1:http://sourceforge.net/downloads/mingw/MSYS/BaseSystem/sed/sed-4.2.1-2/ 何もLZMAで圧縮するこたぁねーだろ... 嫌がらせか?