Как всегда заново генерировать файл заголовка версии, когда основной текстовый файл VERSION изменяется с помощью CMake? - PullRequest
4 голосов
/ 06 ноября 2019

Я поддерживаю фреймворк / библиотеку C ++, которая использует CMake в качестве своей системы сборки. Версия фреймворка отражается в файле с именем VERSION (как во многих библиотеках с открытым исходным кодом).

Я хотел бы сгенерировать заголовочный файл C ++ со строкой версии, используя VERSION в качестве входных данных. Я также хочу, чтобы это происходило во время пересборки, а не только когда воссоздает файлы проекта . Было бы желательно, если бы VERSION была зависимостью, поэтому заголовочный файл создается только при изменении VERSION.

Я знаком с техникой, использующей команду file() в CMake для чтения конкурсовVERSION, например,

file(STRINGS "VERSION" FRAMEWORK_VERSION)

И затем создание файла с помощью команды configure_file, например:

configure_file(version.h.in version.h)

Но это только генерирует файл заголовка во время генерации файлов проекта,Если файл VERSION изменен, файл заголовка версии не будет повторно сгенерирован при повторной сборке (т. Е. Работает cmake --build .).

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

Какова лучшая практика здесь?

Разве невозможно решить эту проблему, только используя CMake

1 Ответ

1 голос
/ 06 ноября 2019

Одно решение CMake-only заключается в том, чтобы обернуть команды, которые вы предлагали, в пользовательскую цель для запуска сценария CMake. Если вы сделаете вашу библиотеку зависимой от пользовательской цели, она будет действовать следующим образом:

  • Генерирует version.h во время компиляции перед сборкой библиотеки.
  • Повторно генерирует version.h только если его содержимое изменится (новый номер версии или новый файл шаблона, version.h.in)

Сценарий (скажем, VersionHeader.cmake) для пользовательской целипрочтет номер версии из файла VERSION и при необходимости создаст новый файл version.h. Сценарий может выглядеть следующим образом:

file(STRINGS "${CMAKE_SOURCE_DIR}/VERSION" FRAMEWORK_VERSION)
configure_file(${CMAKE_CURRENT_LIST_DIR}/version.h.in ${CMAKE_CURRENT_LIST_DIR}/version.h @ONLY)

Затем в файле CMakeLists.txt определите пользовательскую цель для , запустите сценарий :

add_custom_target(VersionHeader
  ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_LIST_DIR}/VersionHeader.cmake
)
add_dependencies(MyFrameworkLib VersionHeader)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...