изменение имени проекта при каждой сборке

#cmake

#cmake

Вопрос:

У меня есть пользовательский makefile, используемый для управления версиями. Он в основном устанавливает версию в соответствии с некоторыми предопределенными правилами и извлекает информацию из репозитория git, я хочу интегрировать ее с проектом esp32 cmake. До сих пор мне удавалось запускать makefile из cmakelist.txt файл, использующий

add_custom_target(управление версиями ВСЕХ КОМАНД ${CMAKE_COMMAND} -P «sometext.cmake»)

и в sometext.cmake я вызываю makefile, который устанавливает переменную FirmwareVersion.

Я использую эту переменную в корне cmakelist.txt чтобы установить проект (${FirmwareVersion})

Но я хочу, чтобы название проекта менялось каждый раз при изменении FirmwareVersion.

Но команда проекта работает только в том случае, если есть какие-то изменения в cmakelist.txt

Любая помощь в ее достижении высоко ценится.

Спасибо

Комментарии:

1. Перенастройка проекта для каждой отдельной сборки кажется мне плохой идеей. Кроме того, изменение названия проекта мало влияет на результаты сборки. Не могли бы вы объяснить желаемый результат изменения и на чем на самом деле основан номер версии? (Это просто подсчет числа? Если да, то как вы синхронизируете это на разных машинах?)

2. Это тег, взятый из управления версиями git и добавляющий их к имени двоичных файлов, чтобы получить статус репозитория git из двоичного имени

Ответ №1:

project() Команда также имеет VERSION ключевое слово named. Это то, что вы на самом деле хотите. Вы можете сохранить фактическую версию в каком-нибудь дополнительном файле CMake (например version.cmake )

 set(VERSION_FROM_GIT "1.2.3 9a6b075")
 

и используйте, как

 include("${CMAKE_CURRENT_SOURCE_DIR}/version.cmake")
project(MyProject VERSION ${VERSION_FROM_GIT} ...)
...
 

Вам решать, как вы собираетесь обновлять этот файл… Есть много способов сделать это.

Комментарии:

1. Но этот вызов проекта выполняется только в файле cmake, который выполняется только при изменении файла cmake или каталогов, поэтому, если моя версия git изменится, она не добавит новую версию git к двоичным файлам

2. @ankish Это полностью зависит от того, как вы собираетесь обновлять version.cmake . Например, вы можете запускать git describe или git rev-parse из CMake, или как пользовательский вывод / цель… Какая-то цель вашего проекта может зависеть от нее или от этапа до / после сборки… Эти варианты первыми пришли мне в голову… Я не знаю ваших целей и почему вы хотели изменить название проекта вместо версии %)

Ответ №2:

Вы можете указать cmake выполнить перенастройку, если файл изменяется. Поскольку .git каталог содержит HEAD файл, либо обозначающий хэш фиксации отсоединенного заголовка, либо ссылку на файл, содержащий хэш фиксации, вы можете использовать эти файлы в качестве зависимостей конфигурации.

 # assume the .git directory is in the same directory as this CMakeLists.txt
set(GIT_HEAD_FILE "${CMAKE_CURRENT_SOURCE_DIR}/.git/HEAD")

# add dependency to the head itself
set_property(DIRECTORY . APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${GIT_HEAD_FILE}")

file(READ "${GIT_HEAD_FILE}" GIT_HEAD_CONTENT)

if (GIT_HEAD_CONTENT MATCHES "ref:  ([^ ] )")
    # add file referenced in HEAD for non detached head state
    set_property(DIRECTORY . APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/.git/${CMAKE_MATCH_1}")
endif()

... your logic depending on the git version goes here ...
 

Это становится немного сложнее, если вы собираетесь использовать свой репозиторий в качестве подмодуля другого репозитория, поскольку .git каталог не обязательно находится в подмодуле.

Комментарии:

1. Пытался использовать эти команды зависимостей # предположим, что каталог .git находится в том же каталоге, что и этот CMakeLists.txt set(GIT_HEAD_FILE «${CMAKE_CURRENT_SOURCE_DIR}/.git/HEAD») # добавить зависимость к самому заголовку set_property(КАТАЛОГ . ДОБАВИТЬ СВОЙСТВО CMAKE_CONFIGURE_DEPENDS «${GIT_HEAD_FILE}»), но почему-то никакой перенастройки не происходит, даже если я меняю теги git

2. Я не утверждал, что не может быть ложных срабатываний. Другим сценарием может быть проверка другой ветви, которая указывает на текущую фиксацию: это изменяет содержимое HEAD файла, чтобы ссылаться на другой файл, но этот файл может содержать тот же хэш фиксации. Однако cmake не может сообщить об этом, не проверив содержимое файла. Единственный способ избежать этого, который я вижу, — это интегрировать скрипт git hook, который обновляет некоторый файл, только если коммит действительно изменился, но вам потребуется дополнительная настройка после каждого клонирования репозитория, чтобы это сработало…

3. Обратите внимание, что это можно было бы улучшить, если бы вы не требовали внесения изменений, которые приводят к перенастройке всего проекта. Например. если вас устраивает содержимое заголовка, изменяющееся на основе хэша фиксации, вы можете просто использовать пользовательскую команду для создания этого заголовка, который не требует изменения.требуется перенастройка всего проекта.

4. cmake_minimum_required(ВЕРСИЯ 3.5) включает(C:/Projekt/Lapp/src/predictive-maintenance-box.pmb-software/Versioning.cmake ) add_custom_target(управление версиями ЗАВИСИТ ОТ тега version_tag ) add_custom_command(ВЫВОД КОМАНДЫ POST_BUILD С тегом version_tag ${CMAKE_COMMAND} -P «${CMAKE_CURRENT_SOURCE_DIR}/Versioning.cmake» ) set_property(СВОЙСТВО ДОБАВЛЕНИЯ КАТАЛОГА CMAKE_CONFIGURE_DEPENDS «firmwareversion» ) include($ENV {IDF_PATH}/tools/cmake/project.cmake) проект (lapppdm_ ${FirmwareVersion}_FW) это файл CMakeLists, который я использую

5. execute_process(COMMAND cs-make -f «../mk/detect_git_generate_version.mk» RESULT_VARIABLE CMD_ERROR OUTPUT_VARIABLE CMD_OUTPUT OUTPUT_STRIP_TRAILING_WHITESPACE) СООБЩЕНИЕ (СТАТУС «CMD_ERROR:» ${CMD_ERROR}) СООБЩЕНИЕ (СТАТУС «CMD_OUTPUT:» ${CMD_OUTPUT}) строка (СОВПАДЕНИЕ РЕГУЛЯРНЫХ ВЫРАЖЕНИЙ «Имя файла: [^ $] «FileName ${CMD_OUTPUT}) строка (СООТВЕТСТВИЕ РЕГУЛЯРНОМУ ВЫРАЖЕНИЮ «V[^ $] » FirmwareVersion ${FileName}) файл (ЗАПИСЬ firmwareversion ${FirmwareVersion}) это скрипт cmake, который я использую для изменения содержимого файла firmwareversion, но файл не изменяется для перенастройки CMakeLists