makefileでc++ビルド時にgitのcommit idを埋め込む

時間のかかる数値計算を行っていると、どのプログラムによる結果なのかを見返したくなるときがある。以下はそんな場合に有効。

gitの最新のcommitを取得&unstagedがあるか判定

ワンライナーで書いてみた。そんなに難しくはない。

git rev-parse --short HEAD | tr -d '\n'; if [ `git status -s -uno | wc -l` -ne 0 ]; then echo "_unstaged"; fi
  • git rev-parse --short HEADでコミット取得
    • これをtr -d '\n'で返り値の改行を削除する
  • git status -s -uno追跡されているファイルのうち、変更したファイル名を列挙
    • wc -lでその数を数える
    • 条件分岐でこれらが一行でもあれば、_unstagedを後ろにつける

ビルド時に埋め込む

上記ワンライナを使用して以下でCOMMITを取得

COMMIT := $(shell git rev-parse --short HEAD | tr -d '\n'; if [ `git status -s -uno | wc -l` -ne 0 ]; then echo "_unstaged"; fi)

あとはコンパイルの際、(gccやclangなどは)オプションで-DCOMMIT_ID=\"$(COMMIT)\"を渡してやればOK(この場合は#define COMMIT_ID 00aabbのようになる。プログラム中ではこのマクロを埋め込んでやれば良い。

補足

上記でビルドは問題なく通るはずだが、エディタなどが未定義のマクロを使うなと怒ってくることがある。その場合は

#ifndef COMMIT_ID
	#define COMMIT_ID "undefined"
#endif

などと先頭に記載しておけば良いだろう。

Built with Hugo
Theme Stack designed by Jimmy