Возможно, вы захотите написать свой исходный код, чтобы использовать #defined константу строки версии. Затем вы можете передать это через вашу сборку с опцией -DMY_VERSION=...
. Это также позволит вам встроить в код значение по умолчанию, заключенное в #ifndef
, на всякий случай!
#ifndef MY_VERSION
#define MY_VERSION 0.0.1-alpha
#endif
print_version() {
printf("my product: %s\n", MY_VERSION);
}
Хороший способ справиться с этим на стороне процесса сборки для создания промежуточного продукта сборки, который представляет собой просто фрагмент make-файла, подобный MY_VERSION = "..."
. Это снова добавляет избыточность, позволяя вам распространять проект с уже созданным файлом версии, чтобы сборка не зависела от наличия SCM.
Затем вы можете создать строку версии так, как вам нравится, например:
echo -n 'MY_VERSION = "' > VERSION_FILE
git describe >> VERSION_FILE
echo "Compiled on $(date)" >> VERSION_FILE
...
echo '"' >> VERSION_FILE
Затем в свой основной make-файл включите этот фрагмент и добавьте -DMY_VERSION='"$(MY_VERSION)"'
к флагам сборки для соответствующего объекта.
Небольшое изменение: сделайте ваш сгенерированный файл просто строкой версии, затем перетащите это значение в соответствующую переменную в make-файле.
Если вам нужна помощь с конкретными командами git, чтобы получить желаемый результат, не стесняйтесь комментировать. git describe
отличный, хотя, предназначенный именно для такого рода вещей. Вывод по умолчанию - это ближайший предок тега текущего коммита, дефис, число коммитов с момента хэга тега, дефиса и сокращенного коммита.