Каков наилучший способ вставить информацию о версии и арке в исходники C ++? - PullRequest
2 голосов
/ 19 января 2010

Я хочу, чтобы моя программа на C ++ включала параметр «--version», который заставляет ее печатать:

  • Архитектура, скомпилированная для
  • Версия источника (напримерv0.1.0)
  • Имя приложения

Я также впервые использую autoconf / automake, и я замечаю, что configure.ac имеет как двоичный файл, так и версию,В настоящее время в нем нет информации об архитектуре, и я не хочу добавлять такую ​​информацию, поскольку я буду компилировать под несколькими арками.

Есть ли простой способ автоматизировать вставку версии/ arch / appname информация в заголовке или исходном файле?Как большинство C ++ кодеров делают это?

Ответы [ 2 ]

4 голосов
/ 20 января 2010

autoconf дает вам config.h, который предоставляет строковые макросы, такие как PACKAGE, PACKAGE_NAME, PACKAGE_STRING, PACKAGE_VERSION и VERSION.

(Когда я использую парсер аргументов Argp , я просто использую

#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <argp.h>
const char *argp_program_version = PACKAGE_STRING;
const char *argp_program_bug_address = PACKAGE_BUGREPORT;
/* et cetera */
int main(int argc, char **argv) {
    error_t argp_result = argp_parse(&argp, argc, argv, 0, 0, NULL);
    if (argp_result) return argp_result;
    /* et cetera */
}

, а затем --help, --version и т. Д. Просто автоматически работают.)

Вы также можете добавить

AC_CANONICAL_HOST
AC_DEFINE_UNQUOTED([CHOST], ["$host"], [Canonical host])
AC_CANONICAL_BUILD
AC_DEFINE_UNQUOTED([CBUILD], ["$build"], [Canonical build])
AC_CANONICAL_TARGET
AC_DEFINE_UNQUOTED([CTARGET], ["$target"], [Canonical target])

к вашему configure.ac, если вы хотите, чтобы эти строковые макросы также были в вашем config.h. Обычно это строки вида $arch-$vendor-$kernel-$libc, где
CHOST - это платформа, которая будет запускать программное обеспечение после его сборки,
CBUILD является платформой, которая в настоящее время создает программное обеспечение, а
CTARGET - платформа, на которой будет работать программное обеспечение.
(Это все одно и то же, если вы не выполняете кросс-компиляцию или не создаете кросс-компиляцию инструментария.)

1 голос
/ 19 января 2010

Напишите скрипт на python, который сгенерирует исходный файл вашей версии.Затем запустите его с помощью любых скриптов / инструментов сборки, которые вы используете.

Выберите правило, чтобы фактически переписать файл версии и применить его в скрипте Python: оно действительно зависит от типа организации и организации выпуска, которую вы делаете.


В моемДомашний проект Я использую скрипт, который генерирует файл версии каждый раз, когда я собираю, потому что мне нужно знать, какой компьютер-разработчик создал версию и в какое время.

Но во многих работах я использовал скрипт, который генерировал файл версии, но только если я этого хотел.Это потому, что команда разработчиков решила, когда конкретная версия будет «релизом».

Я предложил использовать скрипт Python, потому что Python работает на всех платформах разработки, и он действительно мощный и простой, когда дело доходит до манипуляций с текстовыми файлами.Затем он может быть вызван любой системой сборки (Visual Studio, CMake и т. Д.), Которую вы используете.

...