8

いくつかのバイナリを特定の場所にコピーするための Cmake 関数が必要です。これには、次の関数定義があります。

function ( collect_binaries TARGET_NAME DEST_DIR )
   set ( targetsToCopy ${ARGN} )

   set ( copy_cmd "COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR}\n" )

   foreach ( target ${targetsToCopy} )
      LIST( APPEND copy_cmd "COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${DEST_DIR}$<TARGET_FILE_NAME:${target}>\n")
   endforeach( target ${targetsToCopy} )

   #message( FATAL_ERROR ${copy_cmd} )
   add_custom_target( ${TARGET_NAME} )
   add_custom_command( TARGET ${TARGET_NAME} PRE_BUILD ${copy_cmd} )

endfunction( collect_binaries )

そして、次の使用法:

collect_binaries( bin_copy ${PROJECT_BINARY_DIR}/out/ target_1 target_2 target3 )

プロジェクト ツリー内に target_1、target_2、および target_3 が定義されています。これを念頭に置いて、次の Cmake configure 出力を得ました。

binary_copy.cmake:15 (add_custom_command) での CMake 警告 (dev):

ポリシー CMP0040 が設定されていません: add_custom_command() の TARGET 署名のターゲットが存在する必要があります。ポリシーの詳細については、「cmake --help-policy CMP0040」を実行してください。cmake_policy コマンドを使用してポリシーを設定し、この警告を抑制します。

このコンテキストでは、そのターゲットは不明のようです...しかし、それは存在し、タイプミスはありません。ここでの問題は何ですか?

4

2 に答える 2

0

コマンド フローadd_custom_command(TARGET ...)は、ライブラリおよび実行可能ターゲットのみを対象としています。で作成されたターゲット用ではありませんadd_cusom_target

カスタム ターゲットがコピーされたバイナリに依存するようにし、そのバイナリをコピーするためのコマンドを作成する必要があります。(注意: cmake コマンドの引数のリストは引用符で囲まないでください)。

function ( collect_binaries TARGET_NAME DEST_DIR )
    set ( targetsToCopy ${ARGN} )

    set (create_directory_cmd COMMAND ${CMAKE_COMMAND} -E make_directory ${DEST_DIR})

    # Create one custom command per every file to be copied.
    # Also collect list of output files.
    set(output_files)
    foreach ( target ${targetsToCopy} )
        set(output_file "${DEST_DIR}/$<TARGET_FILE_NAME:${target}>")
        add_custom_command(OUTPUT ${output_file}
            ${create_directory_cmd}
            COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> ${output_file})
        list(APPEND output_files ${output_file})
        # It is sufficient to create directory only once. Just clear corresponded variable.
        set(create_directory_cmd)
    endforeach( target ${targetsToCopy} )

    add_custom_target( ${TARGET_NAME} DEPENDS ${output_files})
endfunction( collect_binaries )

コピーされたバイナリのみが必要で、元のバイナリには興味がない場合は、必要な場所にバイナリを作成するように CMake に指示する方が簡単です。また

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/)

ターゲットを作成する前、または

set_target_properties(target_1 target_2 target3
    PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/out/)

ターゲットを作成した後で十分です。

于 2015-11-13T17:22:42.107 に答える