macro (copy_files_at_build_time targetname) #usage: copy_files_at_build_time(<targetname> <file> [<files>] <destination>)
if(ARGC LESS 3)
message(ERROR "copy_files_at_build_time called with less than 3 arguments")
endif(ARGC LESS 3)
MATH(EXPR LAST_INDEX "${ARGC}-2")
MATH(EXPR DEST_INDEX "${ARGC}-1")
set(MY_DESTINATION ${ARGV${DEST_INDEX}})
foreach(I RANGE 1 ${LAST_INDEX})
message (STATUS "${CMAKE_COMMAND} -E copy ${ARGV${I}} ${MY_DESTINATION}")
add_custom_command(TARGET ${targetname} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${ARGV${I}} ${MY_DESTINATION})
endforeach(I)
endmacro(copy_files_at_build_time)
如您所见,有一条调试消息,不幸的是,当我打印它们时,${ARGV${I}}
和${MY_DESTINATION}
(即${ARGV${DEST_INDEX}}
)都是空的。因此,似乎无法通过使用变量作为变量名的最后部分来访问 ARGV1、ARGV2 等(请参阅宏文档)。我现在将使用list命令实现一个解决方法,但我的问题是:
如果必须跳过某些元素(例如第一个和最后一个),是否有更简单的方法来循环 ARGV0、ARGV1、ARGV2 元素?
编辑
可悲的是,我发现即使 LIST 命令也不能在 ARGV 上运行!但是如果我首先创建 ARGV 的副本然后在其上执行 LIST 命令,它们就可以工作。