Переименуйте выходные данные CPack
Вопрос
Я хотел бы переименовать установочный файл, который создает CPack (v2.8.7), чтобы включить номер версии, который получен во время сборки из системы контроля версий.Похоже, это невозможно сделать, установив переменные CPACK_ *, потому что это происходит во время "cmake".
Что я хочу иметь возможность сделать, так это запустить "(n) make package" и создать установочный файл без каких-либо дополнительных команд.Два возможных подхода, о которых я знаю, - это манипулирование переменными имени файла CPack во время сборки и переименование конечного результата CPack.
Если использовать "включить (CPack)" в файл CMakeLists.txt, то окажется, что CPack всегда запускается последним, и у вас не может быть команды после сборки. Это сообщение из списка рассылки предполагает, что пользовательский целевой объект может быть записан для запуска CPack, но я не смог понять, как это сделать без создания бесконечной рекурсии.
Как это можно сделать?
Решение
с небольшим количеством помощи от списка рассылки Cmake I выяснил, как это сделать, используя 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)
.
create-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}")
. Другие советы
Почему бы не извлечь информацию о сборке из VCS во время cmake?Затем вы можете легко изменить CPACK_PACKAGE_FILE_NAME, чтобы включить свой номер версии.
Дополнительный бонус:Делая это во время CMake, вы можете, напримерзаполнить файл "Readme.txt" в Git-инфо через CMake по конфигурационный файл и добавьте его в свой пакет.Или, возможно, используйте его для заполнения "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}" )