7

CPack (v2.8.7) が生成するインストーラー ファイルの名前を変更して、ビルド時にバージョン管理システムから取得したバージョン番号を含めたいと考えています。これは、「cmake」時に発生するため、CPACK_* 変数を設定しても実行できないようです。

私ができるようにしたいのは、「(n)make package」を実行して、それ以上のコマンドを必要とせずにインストーラー ファイルを作成することです。私が知っている 2 つの可能なアプローチは、ビルド時に CPack ファイル名変数を操作することと、CPack の最終出力の名前を変更することです。

CMakeLists.txt ファイルで「include(CPack)」を使用すると、CPack が常に最後に実行され、ビルド後のコマンドを使用できないように見えます。このメーリング リスト メッセージは、カスタム ターゲットを作成して CPack を実行できることを示唆していますが、無限再帰を作成せずにそれを行う方法を理解できませんでした。

これはどのように行うことができますか?

4

2 に答える 2

5

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}")
于 2012-03-09T01:39:16.653 に答える
4

cmake-time で VCS からビルド情報を抽出しないのはなぜですか? 次に、CPACK_PACKAGE_FILE_NAME を簡単に変更して、バージョン番号を含めることができます。

追加ボーナス: CMake 時にこれを行う場合、たとえば、CMake のconfigure_fileを使用して "Readme.txt" ファイルに git-info を入力し、それをパッケージに追加できます。または、ビルドで使用される「config.h」を埋めるために使用することもできます。

例: 私自身のプロジェクトの 1 つに、Git を見つけてソース コード リポジトリから現在のチェンジセット ハッシュを抽出する小さな 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} )

結果は、Git_Commit_HashCPack のセットアップ時に使用される 7 文字のハッシュ値を持つ変数になります。

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}" )
于 2012-03-08T12:45:07.463 に答える