2011-07-12 4 views
4

git describeコマンドの結果を実行時にアクセスできるようにするにはどうすればよいですか?embed gitはC++バイナリで文字列を記述する

私はこの

g++ -DVERSION_NUMBER=2345 

ような何かを行うことができます。そして、私のコードでは、私が行うことができます知っている:

std::cout << VERSION_NUMBER << std::endl; 

これは素晴らしいですが、バージョン番号の値がある場合は動作しません。 git describeコマンドの出力などの文字列。

このようなことをする方法はありますか?

ありがとうございました。

+0

'G ++ -DVERSION_NUMBER = "\ 'Gitは説明\'"'は動作しませんか? –

+0

@Karl Bielefeldtいいえ、そうではありません。 -Dは基本的にマクロを定義します。マクロは数値で評価することができますが、文字列が含まれている場合、gccはその文字列を明らかに動作しないコードとして解釈しようとします。 – anio

+2

私は、引用符がシェルによって削除されていることを確認します。 'g ++ -DVERSION_NUMBER =" \ "\' git describe \ '\" " –

答えて

2

automakeを使用する場合は、次のようなものを使用できます。私はこれを長い間使ってきましたが、あなたが求めているものを達成するためにはうまくいきます。 Makefile.am

BUILT_SOURCES = git_info.h 
EXTRA_DIST = echo_git_info.sh win_config.h 

. 
. 
(main build recipes) 
. 
. 

git_info.h: $(HEADERS) $(SOURCES) 
    echo_git_info.sh > git_info.h 

echo_git_info.shにおいて:

#! /bin/sh 

function echo_git_info { 
    if [[ $(which git 2> /dev/null) ]] 
    then 
     local STATUS 
     STATUS=$(git status 2>/dev/null) 
     if [[ -z $STATUS ]] 
     then 
      return 
     fi 
     echo "`git symbolic-ref HEAD 2> /dev/null | cut -b 12-`-`git log --pretty=format:\"%h\" -1`, " 
     return 
    fi 
} 

echo "// Auto-generated source/build information." 
echo "#define GIT_SOURCE_DESC \"`echo_git_info``date`\"" 

が上記可変GIT_SOURCE_DESCになり、ファイルgit_info.hで定義されています。このように、あなたのmain.cppあなたはその後、缶の中:

#include <iostream> 
#include "ginkgo_info.h" 

int main(int argc, char* argv[]) { 
    std::cout << "Source is: " << $GIT_SOURCE_DESC << std::endl; 
} 
+0

のような引用符をエスケープした場合、私にとってはうまくいきます。私は自動作成を使用しません。正確には私が探していたものではありませんが、うまくいくでしょう。ありがとう! – anio

0

これはおそらく最良ではない方法です。バイナリファイルの最後に文字列などを書くことができます。これを達成するためのチュートリアルは次のとおりです。http://edn.embarcadero.com/article/27979

コードはC++ではありません。しかし、例をC++に移植することができます。

2

mercurial wikiには、makeでこの情報を収集する方法がさまざまです。

4

私は同じことをやってみたかったです。

のMakefile:

VERSION=\"$(shell git describe)\" 
CFLAGS=-DVERSION_NUMBER=$(VERSION) # etc 

はその後のコードで、私は VERSION_NUMBERは問題なく定義参照することができ、私はこのようなGNUのmakeの「シェル」コマンドを使用して -Dフラグがうまく動作するために取得することができました例えば

test.cの:

printf("Version string: %s\n", VERSION_NUMBER); 
+1

@KarlBielefeldtが上で述べたように、シェルが最初のセットを丁寧に削除するならば、エスケープされた引用符を追加する必要があるかもしれません。 –

関連する問題