2015-09-19 5 views
1

При использовании исходного кода вы можете использовать команду git describe, чтобы получить номер текущей версии.Автоматически включать текущий номер версии при компиляции

При использовании двоичного кода, я добавил опцию, которая позволяет пользователям передавать в --version флаг, чтобы получить, что номер текущей версии:

if (argc >= 2) { 
    if (argv[1] == "--version") { 
     cout << "eval version v0.1-16-g74a9332"; 
    } 
} 

Проблема заключается в том, что значение v0.1-16-g74a9332 теперь жёстко в мой источник. Если я уйду и что-то изменим где-нибудь еще, мне придется увеличивать это значение каждый раз, когда я совершаю (что просто требует конфликтов слияния!)

Кроме того, часть g74a9332 является хешем текущей фиксации. Если я изменю это значение в исходном коде, изменяется хэш фиксации.

Есть ли какой-либо способ для меня, а не hardcode номер версии в коде, имеет ли C++ «знать» номер версии v0.1-16-g74a9332, когда он компилирует двоичный файл?

+0

Я также использую 'make' для компиляции, поэтому ответы, которые включают в себя это требование допускается, но я надеялся на какой-то вариант компилятора или функцию. – IQAndreas

+0

Меня тоже интересует решение. Обычно я использую версию как ветку (майор)/комментарии (минор). – Stormbringer

+1

@IQAndreas В вашем коде есть элементарная ошибка (и в другом правильном решении @ Oleg). 'argv [1] ==" --version "' представляет собой сравнение двух разных указателей 'char *' и всегда будет терпеть неудачу.Вам нужно 'std :: string (argv [1]) ==" -version "' –

ответ

1

Введите номер версии во время строительства. Для этого, сделайте заголовок version.h с декларацией глобальной переменной:

// add include guards 
extern char const * const version_string; 

Чтобы использовать строку версий, включить этот заголовок и относятся к этой глобальной переменной.

Для простоты, также создать шаблон для соответствующего определения, version.c.template:

char const * const version_string = 
    "v0.1-COMMIT"; 

Затем добавьте правило в ваш Makefile построить соответствующий файл исходного кода со строкой в ​​определении этой переменной заменяется на фактическое совершение номер:

COMMIT := $(shell git rev-parse --short HEAD) 
.PHONY: version.c 
version.c: version.c.template 
    sed -e "s/COMMIT/$(COMMIT)/g" version.c.template > version.c 

Включить что version.c в компиляции и процесс связывания.

Конечно, вы можете масштабировать это, чтобы создать много информации во время сборки.

(я на мобильный и, таким образом, не проверял выше код)


Поскольку компилятор ничего не знает о том, как организовать свой исходный код, там нет такого флага.

0

Вы должны изменить свой код немного

if (argc >= 2) { 
    if (std::string(argv[1]) == "--version") { 
     cout << MY_VERSION; 
    } 
} 

Затем ваш Makefile должен быть:

result=$(shell git describe) 

all: 
    g++ -DMY_VERSION=\"$(result)\" -o main main.cpp 

clean: 
    rm -f main 
+1

'-DMY_VERSION' <- Предполагается, что существует пробел между' -D' и именем переменной? – IQAndreas

+1

Нет места для моего g ++ (4.8.3). Это рабочая версия. Я попробовал. –

+0

[Я думаю, вы правы] (http://homepages.gac.edu/~mc38/2001J/documentation/g++.html). Eeew ... Я читал это как сокращение для '-D -M -Y -_ -V -E-R -S -I -O -N' и т. Д. На самом деле, по той же причине у меня есть личная вендетта против которые используют один аргумент командной строки '-' для« многосимвольных »команд. – IQAndreas

Смежные вопросы