Можно ли в cmake получить сообщение текущего коммита git?

168
23 декабря 2018, 12:30

Пишу консольное приложение на с++ под linux с системой сборки CMake. При запуске приложения оно отображает основную информацию о себе в т.ч. номер версии приложения, который определяется коммитом. Сейчас мне каждый раз приходится изменять эту константу руками (в 90% случаях я просто забываю её менять при очередном коммите). Я хочу что бы при каждой компиляции эта константа определялась автоматически. Самым разумным решением мне кажется заставить Cmake при сборке считывать информацию текущего коммита в которой содержится необходимая строка. Возможно ли как-то сделать это и если возможно то как?

Answer 1

Создайте себе файл с именем version.cmake (или другое, по вкусу) и добавьте туда такое

    exec_program(
      "git"
      ${CMAKE_CURRENT_SOURCE_DIR}
      ARGS "rev-parse HEAD"
      OUTPUT_VARIABLE REL
    )
    configure_file( "version.h.template" "${CMAKE_CURRENT_BINARY_DIR}/version.h" )

Дальше создайте файл-шаблон version.h.template

 #pragma once
 #define GIT_REL  "${REL}"

В свой основной CMakeLists.txt добавьте где то тако

add_custom_target( git_version ALL
    "${CMAKE_COMMAND}" -E chdir "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_COMMAND}" -P "version.cmake"
)
add_dependencies( ${PROJECT_NAME} git_version )

PROJECT_NAME - это имя проекта, скорректируйте по обстоятельствам.

Теперь при запуске этой зависимости, cmake будет бегать к гиту и забирать версию и добавлять ее в хедер version.h

А что с этой версией Вы будете делать - это уже Ваше дело.

Ещё

  • http://xit0.org/2013/04/cmake-use-git-branch-and-commit-details-in-project/
  • https://stackoverflow.com/questions/1435953/how-can-i-pass-git-sha1-to-compiler-as-definition-using-cmake
  • https://bravenewmethod.com/2017/07/14/git-revision-as-compiler-definition-in-build-with-cmake/
READ ALSO
Реализация time line с помощью цикла или sleep на Linux

Реализация time line с помощью цикла или sleep на Linux

Необходимо реализовать класс time line, который будет отсчитывать время через заданный ему интервалКак лучше это сделать?

201
Сглаживание графики в Qt

Сглаживание графики в Qt

Есть следующий минимально компилируемый пример:

145
Сортировка в с++

Сортировка в с++

Недавно начал програмировать на с++ и возник вопросНаписал программу которая показывает список учеников и их оценки

340
C++ глобальный enum [закрыт]

C++ глобальный enum [закрыт]

Как создать enum который будет доступен везде? Я вот например создал enum и с ним все нормально работает в классах где создаю а вот в класе наследнике...

193