Вставка вывода терминала в исходный файл перед компиляцией

У меня есть проект C ++, который хранится в репозитории Bazaar. Этот проект также использует #defineСтрока для отображения номера версии. Кто-то только что спросил, можем ли мы просто привязать этот отображаемый номер версии к номеру ревизии репозитория bzr.

Итак, в псевдо-C, псевдо-bash, что-то вроде:

#define VERSION_STRING "revision $(bzr revno)"//...
cout << "Starting " << VERSION_STRING;

Или так. Как бы вы ответили на этот вопрос? Запускает ли make-файл сценарий, который вставляет вывод этой команды в соответствующий исходный файл? Есть ли для этого решение на макроуровне? Так далее?

Я открыт для любых умных решений, так как на этом я рисую образованный бланк. = D

2

Решение

Компилятор будет иметь флаг для внешнего определения значения макроса. Для g ++ и clang ++ это -D:

g++ -DVERSION_STRING="revision $(bzr revno)" file.cpp -c -o file.o

Чтобы получить это в файле в виде строки, вы можете добавить дополнительные кавычки в определение:

g++ -DVERSION_STRING="\"revision $(bzr revno)"\" file.cpp -c -o file.o

или вам нужно знать, как преобразовать это значение в файл, что занимает немного магия:

#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)

Тогда вы также можете иметь значение по умолчанию. Я бы порекомендовал установить переменную, отличную от той, которую вы используете внутри, это помогает отслеживать:

#include <iostream>

#define STRINGIFY_HELPER(X) #X
#define STRINGIFY(X) STRINGIFY_HELPER(X)

#ifdef VERSION
#define VERSION_STRING STRINGIFY(VERSION)
#else
#define VERSION_STRING "0.0.0"#endif

int main()
{
std::cout << VERSION_STRING << '\n';
}

результаты в:

$ g++ -DVERSION="1.0.0" SO.cpp
$ ./a.out
1.0.0
$ g++ SO.cpp
$ ./a.out
0.0.0

Заметка, $(bzr revno) это синтаксис для запуска bzr revno и подставить его вывод в оболочке (синтаксис bash, вероятно, такой же в большинстве других). Как отметил Мусасаби, внутри make-файла синтаксис немного отличается: $(shell bzr revno),

2

Другие решения

Других решений пока нет …