Cmake:基于变量内容的 add_custom_command 参数

Dmi*_*try 8 cmake

我想要一个 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 )
Run Code Online (Sandbox Code Playgroud)

以及以下用法:

collect_binaries( bin_copy ${PROJECT_BINARY_DIR}/out/ target_1 target_2 target3 )
Run Code Online (Sandbox Code Playgroud)

我在项目树中定义了 target_1、target_2 和 target_3。考虑到这一点,我得到了以下 Cmake 配置输出:

binary_copy.cmake:15 (add_custom_command) 处的 CMake 警告 (dev):

策略 CMP0040 未设置:add_custom_command() 的 TARGET 签名中的目标必须存在。运行“cmake --help-policy CMP0040”以获取策略详细信息。使用 cmake_policy 命令设置策略并取消此警告。

在这种情况下,目标似乎是未知的……但它确实存在并且没有错字。这里有什么问题?

sak*_*kra 4

copy_cmd您正在函数中将变量设置collect_binaries为 CMake 字符串。然而add_custom_command,需要一个 CMake 列表来正确解析参数,即:

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

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

   foreach ( target ${targetsToCopy} )
      LIST( APPEND copy_cmd COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${target}> "${DEST_DIR}$<TARGET_FILE_NAME:${target}>")
   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 )
Run Code Online (Sandbox Code Playgroud)