LINUX.ORG.RU

[cmake][svnversion] Вшить номер ревизии в программу

 


0

0

Расскажите, кто и как проделывает сабж. Хочется:
1. Независимость от платформы (нельзя рассчитывать на posix-окружение).
2. Без перекомпиляции и перелинковки, если номер ревизии с последнего успешного вызова make не менялся.
3. Без активного использования символов, нуждающихся в правильном эскейпировании (кавычек, например). Чтобы не напороться на баги в реализации VERBATIM для разных окружений.

★★★★★

Последнее исправление: Manhunt (всего исправлений: 1)
Ответ на: комментарий от Pavval

CONFIGURE_FILE делается во время вызова cmake (во время конфигурения). А нужно, чтобы делалось во время вызова make (во время компиляции). Потому, часто пишут «svn update», и сразу же начинают компиляцию, без переконфигурения.

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от Pavval

> сделай хук на svn update

Нет возможности. Sourceforge не дает лепить свои хуки.

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от Pavval

> Сделай custom_target, которая будет генерить файл. И пропиши ее в зависимости проекта.

Уже ближе. Вопрос в том, как конкретно эта custom_target должна быть устроена, чтобы удовлетворить хотелкам 1, 2 и 3 (которые я привел в самом первом сообщении).

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от Pavval

> сделай хук на svn update

Кроме того, это не сработает, если рабочая копия надергана из нескольких разных ревизий или содержит локальные (не закоммиченные) изменения. В то время как svnversion такое положение вещей заметит и отобразит.

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от Manhunt

Ок.

Независимость от платформы (нельзя рассчитывать на posix-окружение).


Тогда компилируй эту custom target на месте из ее исходников. А напиши на чистом С.

Без перекомпиляции и перелинковки, если номер ревизии с последнего успешного вызова make не менялся.


Все зависит от тебя:)

Pavval ★★★★★
()

вшей номер ревизии в CMakeLists.txt. Обновилась ревизия - автоматически произойдет переконфигурирование

annulen ★★★★★
()
Ответ на: комментарий от annulen

> Тогда компилируй эту custom target на месте из ее исходников. А напиши на чистом С.

Overkill и велосипедостроительство. Неужели нельзя сделать то же самое средствами самого cmake?

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от annulen

> вшей номер ревизии в CMakeLists.txt. Обновилась ревизия - автоматически произойдет переконфигурирование

Эмм, а можно подробнее? Как именно вшивать?

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от Manhunt

Мне кажется бкз какого-то скрипта или даже sed тебе не обойтись. А если тебе надо отвязаться от всего, то тогда только свое самописное. Тебя же не удивляет, что make menuconfig сначала собмрает этот menuconfig, а потом запускает бинарник?

Pavval ★★★★★
()
Ответ на: комментарий от Manhunt

Пример:

//CMakeLists.txt
....
set(Avogadro_VERSION_MAJOR 1)
set(Avogadro_VERSION_MINOR 1)
set(Avogadro_VERSION_PATCH 0)
set(Avogadro_VERSION «${Avogadro_VERSION_MAJOR}.${Avogadro_VERSION_MINOR}»)
set(Avogadro_VERSION_FULL «${Avogadro_VERSION}.${Avogadro_VERSION_PATCH}»)
.....

//config.h.in
...
#define VERSION «@Avogadro_VERSION_FULL@»
....

а затем используешь VERSION внутри программы

annulen ★★★★★
()
Ответ на: комментарий от Manhunt
execute_process(COMMAND svnversion -n
                  OUTPUT_VARIABLE SVN_VERSION
)

CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/include/config.h.cmake ${CMAKE_SOURCE_DIR}/include/config.h )

include/config.h.cmake:

#ifndef CONFIG_H
#define CONFIG_H

#cmakedefine VERSION @SVN_VERSION@

#endif // CONFIG_H

ы?

Pavval ★★★★★
()
Ответ на: комментарий от Manhunt

ок, решение для гита:

# Check if we are building from a Git clone or a released version
function(git_version dir version_var)
# Function to figure out the Git short version hash
if(EXISTS ${dir}/.git)
execute_process(COMMAND git rev-parse --short HEAD
WORKING_DIRECTORY ${dir}
OUTPUT_VARIABLE var)
string(REGEX REPLACE «\n» «» var «${var}»)
message(STATUS «Git revision found to be ${var}»)
set(${version_var} «${var}» PARENT_SCOPE)
endif(EXISTS ${dir}/.git)
endfunction(git_version)

git_version(${CMAKE_SOURCE_DIR} SCM_REVISION)
message(STATUS «Found Git revision is: ${SCM_REVISION}»)
if(SCM_REVISION)
message(STATUS «Building development version from Git clone.»)
else(SCM_REVISION)
message(STATUS «Building released version.»)
endif(SCM_REVISION)

как перенести это на svn - хз, попробуйте самостоятельно

annulen ★★★★★
()
Ответ на: комментарий от Manhunt

Тоже так думал. Только может ты сделай отдельный саталог с генератором конфига. Т.е. чтобы его cmake не был связан с проектом.

Pavval ★★★★★
()
Ответ на: комментарий от Pavval

Публикую результирующее решение, на случай, если кому-то пригодится.

CMakeLists.txt:

set_source_files_properties(
        ${CMAKE_BINARY_DIR}/svn_version.cpp
        PROPERTIES
        GENERATED TRUE
)

add_library(
        svn_version
        STATIC
        ${CMAKE_BINARY_DIR}/svn_version.cpp
)

add_custom_target(
        generate_svn_version_cpp
        COMMAND
        ${CMAKE_COMMAND} -D SOURCE_DIR=${CMAKE_SOURCE_DIR} -D BINARY_DIR=${CMAKE_BINARY_DIR} -P ${CMAKE_SOURCE_DIR}/svn_version.cmake
)

add_dependencies(
        svn_version
        generate_svn_version_cpp
)

svn_version.cmake:

execute_process(
        COMMAND svnversion -n ${SOURCE_DIR}
        OUTPUT_VARIABLE SVN_VERSION
)

configure_file(
        ${SOURCE_DIR}/src/svn_version.cpp.in
        ${BINARY_DIR}/svn_version.cpp
        ESCAPE_QUOTES
        @ONLY
)

src/svn_version.cpp.in:

const char *SvnVersion()
{
        return "@SVN_VERSION@";
}

Manhunt ★★★★★
() автор топика
Ответ на: комментарий от JackyTreehorn

> Не понимаю проблему.

Проблема подробно описана в первом сообщении, и еще подробнее - в обсуждении. Что конкретно не понятно?

Может быть, у вас есть элегантное решение, и вы просто опубликуете код?

Если меняется *.in


За счет чего должны измениться *.in ?

Manhunt ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.