在c ++二进制文件中嵌入git describe string

时间:2011-07-12 15:55:47

标签: git gcc g++

如何将git describe命令的结果嵌入到我的c ++二进制文件中,以便我可以在运行时访问它。

我知道我可以做这样的事情

g++ -DVERSION_NUMBER=2345

然后在我的代码中我可以做到:

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

这很好,但如果版本号的值是一个字符串,例如git describe命令的输出,则无效。

有没有办法做这样的事情?

感谢。

4 个答案:

答案 0 :(得分:4)

我想做同样的事情。通过使用GNU Make的“shell”命令,我能够使-D标志正常工作:

生成文件:

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

然后在代码中我可以引用VERSION_NUMBER定义而没有任何问题,例如

test.c的:

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

答案 1 :(得分:2)

mercurial wiki包含如何使用make收集此信息的不同可能性。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

这可能不是最好的,而是一种方式。您可以将字符串或其他任何内容写入二进制文件的末尾。实现此目标的一个教程是:http://edn.embarcadero.com/article/27979

但代码不是c ++。但是,您可以将示例移植到c ++。