1. ホーム
  2. c

[解決済み] C言語で書いたコードが自動的にGitのバージョンハッシュを出力するには?

2023-03-30 05:20:16

質問

Git のバージョン・ハッシュにアクセスする C 言語コードを書く簡単な方法はありますか?

私は実験室で科学的なデータを収集するためにC言語でソフトウェアを書きました。私のコードは、後で分析するために、収集したデータを .yaml ファイルに記録しています。私の実験は日々変化しており、しばしばコードを修正する必要があります。リビジョンを追跡するために、私は git リポジトリを使用しています。

私は、.yaml データファイルにコメントとして Git リビジョンハッシュを含めることができればと思っています。そうすれば、.yaml ファイルを見て、そのファイルに示されているデータを生成するためにどのコードが使用されたかを正確に知ることができます。これを自動的に行う簡単な方法はありますか?

どのように解決するのですか?

私のプログラムでは、git のバージョン番号とビルドの日付を別のファイルに保持しており、そのファイル名は version.c という別のファイルに格納しています。

#include "version.h"
const char * build_date = "2009-11-10 11:09";
const char * build_git_sha = "6b54ea36e92d4907aba8b3fade7f2d58a921b6cd";

また、ヘッダーファイルもあり、以下のような感じです。

#ifndef VERSION_H
#define VERSION_H
extern const char * build_date; /* 2009-11-10 11:09 */
extern const char * build_git_sha; /* 6b54ea36e92d4907aba8b3fade7f2d58a921b6cd */
#endif /* VERSION_H */

ヘッダファイル、Cファイルともに、以下のようなPerlスクリプトで生成されます。

my $git_sha = `git rev-parse HEAD`;
$git_sha =~ s/\s+//g;
# This contains all the build variables.
my %build;
$build{date} = make_date_time ();
$build{git_sha} = $git_sha;

hash_to_c_file ("version.c", \%build, "build_");

ここで hash_to_c_file を作成するためのすべての作業を行います。 version.cversion.h そして make_date_time は、図のような文字列を作ります。

メインプログラムの中で、ルーチン

#include "version.h"

// The name of this program.
const char * program_name = "magikruiser";
// The version of this program.
const char * version = "0.010";

/* Print an ID stamp for the program. */

static void _program_id_stamp (FILE * output)
{
    fprintf (output, "%s / %s / %s / %s\n",
             program_name, version,
             build_date, build_git_sha);
}

gitについてはそれほど詳しくないので、もっと良い方法があればコメントをお待ちしています。