Переименуйте вывод CPack

Я хотел бы переименовать файл установщика, создаваемый CPack (v2.8.7), чтобы включить номер версии, полученный во время сборки из системы контроля версий. Похоже, это невозможно сделать, установив переменные CPACK_*, потому что это происходит во время «cmake».

Что я хочу сделать, так это запустить «(n) make package» и создать файл установщика без дополнительных команд. Два возможных подхода, о которых я знаю, - это манипулирование переменными имени файла CPack во время сборки и переименование конечного вывода CPack.

Если вы используете «include (CPack)» в файле CMakeLists.txt, кажется, что CPack всегда запускается последним, и у вас не может быть команды после сборки. Это сообщение списка рассылки предполагает, что для запуска CPack можно написать пользовательскую цель, но я не смог понять, как это сделать, не создавая бесконечную рекурсию.

Как это может быть сделано?


person glennr    schedule 08.03.2012    source источник


Ответы (2)


С небольшой помощью из списка рассылки CMake я понял, как это сделать, используя subversion.

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(myapp)

add_executable(main main.cpp)
install(TARGETS main DESTINATION .)

add_custom_target(first ALL
    # update the working copy
    COMMAND ${Subversion_SVN_EXECUTABLE} update ${CMAKE_SOURCE_DIR}

    # generate cpackoptions.cmake at build time so we get the
    # most recent revision number
    COMMAND ${CMAKE_COMMAND}
    -DSOURCE_DIR=${CMAKE_SOURCE_DIR}
    -DBINARY_DIR=${CMAKE_BINARY_DIR}
    -Dproj_name=${CMAKE_PROJECT_NAME}
    -P ${CMAKE_SOURCE_DIR}/create-cpackoptions.cmake
    )

add_dependencies(main first)

set(CPACK_PROJECT_CONFIG_FILE ${CMAKE_BINARY_DIR}/CPackOptions.cmake)

include(CPack)

создать-cpackoptions.cmake

include(FindSubversion)
Subversion_WC_INFO(${SOURCE_DIR} ${proj_name})

set(revision ${${proj_name}_WC_REVISION})

configure_file(${SOURCE_DIR}/CPackOptions.cmake.in
    ${BINARY_DIR}/CPackOptions.cmake
    @ONLY)

cpackOptions.cmake.in

set(CPACK_PACKAGE_FILE_NAME "@proj_name@-${CPACK_PACKAGE_VERSION}r@revision@-${CPACK_SYSTEM_NAME}")
person glennr    schedule 09.03.2012
comment
Вы можете сделать еще один шаг и сгенерировать CPackOptions.cmake.in и create-cpackoptions.cmake из CMakeFile.txt. Это означает, что вам не нужны два файла в исходном дереве. Например: file(WRITE ${CMAKE_BINARY_DIR}/CPackOptions.cmake.in "set(CPACK_PACKAGE_FILE_NAME \"@proj_name@-\${CPACK_PACKAGE_VERSION}r@revision@-\${CPACK_SYSTEM_NAME}\")") - person Ronny Andersson; 23.09.2015

Почему бы не извлечь информацию о сборке из VCS во время cmake? Затем вы можете легко изменить CPACK_PACKAGE_FILE_NAME, чтобы включить номер вашей версии.

Дополнительный бонус: при выполнении этого во время CMake вы можете, например. заполните файл «Readme.txt» git-информацией, используя CMake configure_file и добавьте его в свой пакет. Или, возможно, используйте его для заполнения «config.h», который используется в ваших сборках.

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

# First try to find the git-executable
find_program( Git_EXECUTABLE NAMES git git.cmd PATHS
    ${Git_DIR}
    ENV PATHS
    $ENV{Git_DIR}
)
# Run "git log -n 1 --pretty="%h" for the current commit-hash
execute_process( COMMAND ${Git_EXECUTABLE} "log" "-n" "1" "--pretty=\"%h\"" 
                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
                 OUTPUT_VARIABLE Git_Commit_Hash 
                 OUTPUT_STRIP_TRAILING_WHITESPACE
                 )
# and use a regex to strip quotes.
string( REGEX REPLACE "^\"(.*)\"$" "\\1" Git_Commit_Hash ${Git_Commit_Hash} )

Результатом будет переменная Git_Commit_Hash с 7-символьным хеш-значением, которое используется при настройке CPack:

set( CPACK_PACKAGE_NAME "MyProject" )
message( STATUS "    CPack options: " ${CPACK_PACKAGE_NAME} )
message( STATUS "    Preparing CPACK: " )
message( STATUS "      and hash: ${Git_Commit_Hash}" )

set( CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${Git_Build_Version}_${CPACK_PACKAGE_VERSION}" )
person André    schedule 08.03.2012
comment
Мне действительно нужно было, чтобы это было во время сборки, а не во время cmake, но все равно спасибо за ваш ответ. - person glennr; 09.03.2012
comment
Я боялся, что вы скажете, что... тогда альтернативой является запуск пользовательской команды во время сборки, которая сделает это за вас. - person André; 09.03.2012
comment
Это не так просто. Вы не можете переопределить CPACK_PACKAGE_FILE_NAME во время сборки, потому что CPack читает его из файла конфигурации. Вы должны установить CPACK_PROJECT_CONFIG_FILE в файл, который создается во время сборки. Это то, что делает код в моем ответе. - person glennr; 10.03.2012
comment
Согласен, вы должны подготовить собственный скрипт cmake, как в вашем собственном ответе (проголосовали...). Если кого-то интересует решение cmake-time, я оставлю этот ответ. - person André; 13.03.2012