문제

CPACK (v2.8.7)이 버전 제어 시스템에서 빌드 시간에 획득 한 버전 번호를 포함하도록 생성하는 설치 프로그램 파일의 이름을 바꾸고 싶습니다.그것은 "cmake"시간에서 발생하기 때문에 CPACK_ * 변수를 설정 하여이 작업을 수행 할 수 없습니다.

내가 할 수있는 작업은 "(n)을 실행하는 것입니다."라는 패키지를 만들고 추가 명령을 사용하지 않고 설치 프로그램 파일을 만들어야합니다.내가 알고있는 두 가지 가능한 접근법은 빌드 시간에서 CPACK 파일 이름 변수를 조작하고 CPACK의 최종 출력을 바꿉니다.

cmakeLists.txt 파일에 "포함 (CPACK)"을 사용하는 경우 CPACK는 항상 항상 마지막으로 실행되는 것으로 나타 났으며 POST-빌드 명령을 사용할 수 없습니다.이 메일 링리스트 메시지 사용자 정의 대상이 CPACK을 실행하도록 작성할 수 있음을 제안하지만 i무한 재귀를 만들지 않고 그것을하는 방법을 알아낼 수 없었습니다.

어떻게이 작업을 수행 할 수 있습니까?

도움이 되었습니까?

해결책

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)
.

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}")
.

다른 팁

CMAKE-TIME에서 VCS에서 빌드 정보를 추출하지 않는 이유는 무엇입니까?그런 다음 버전 번호를 포함하도록 cpack_package_file_name을 쉽게 수정할 수 있습니다.

추가 보너스 : cmake-time 에서이 작업을 수행 할 때 예를들 수 있습니다.cmake의 configure_file 패키지에 추가하십시오.또는 아마도 빌드에서 사용되는 "config.h"를 채우는 데 사용됩니다.

예 : 내 자신의 프로젝트 중 하나에서 나는 Cmake 코드가 작은 Cmake 코드가 있으며 소스 코드 저장소에서 현재의 변경 세트 해시를 추출합니다.그것은 정보를 추출하는 최고의 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} )
.

결과는 CPACK 설정시 사용되는 7 char 해시 값이있는 Git_Commit_Hash 변수입니다.

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}" )
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top