Одним из решений является то, что ваша система сборки извлечет значение и сгенерирует некоторый заголовок C ++ (или исходный файл) с этим значением внутри него.
Например, если вы используете CMake, вы можете использовать модуль FindGit , чтобы сделать что-то вроде:
project(...)
# load module.
find_package(Git)
# create "${GIT_HEAD_HASH}" variable that contains
# the SHA-1 of the current tree. This assumes that the
# root CMakeLists is in the root of the Git repository.
git_tree_info(${CMAKE_SOURCE_DIR} GIT_HEAD)
# generate a 'version.h' file based on the 'version.h.in'
# file. replace all @...@ strings with variables in the
# current scope.
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/version.h.in
${CMAKE_CURRENT_SOURCE_DIR}/version.h
@ONLY
)
Затем добавьте следующий version.h.in
файл:
#ifndef _version_h__
#define _version_h__
static const char VERSION[] = "@GIT_HEAD_HASH@";
#endif
CMake заменит строку @GIT_HEAD_HASH@
на значение, извлеченное с помощью get_tree_info()
.
Тогда из вашего обычного кода:
#include "version.h"
#include <cstdlib>
#include <cstring>
#include <iostream>
int main(int argc, char ** argv)
{
if ((argc == 2) && (std::strcmp(argv[1],"--version") == 0))
{
std::cerr
<< VERSION
<< std::endl;
return (EXIT_FAILURE);
}
// ...
}
Это упрощенный и абсолютно непроверенный пример. Если вы посмотрите на источники модуля FindGit
CMake, вы увидите, что он просто запускает команду execute_process()
во время сборки для извлечения информации. Вы можете изменить его, чтобы извлечь что-либо на основе вызова интерфейса командной строки Git.