Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环使用cmake中宏的部分参数_Cmake - Fatal编程技术网

循环使用cmake中宏的部分参数

循环使用cmake中宏的部分参数,cmake,Cmake,受此启发,我试图创建一个在构建时复制文件列表的 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 wit

受此启发,我试图创建一个在构建时复制文件列表的

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)
macro(在生成时复制文件targetname)#用法:在生成时复制文件([])
如果(ARGC减去3)
消息(错误“在生成时用少于3个参数调用复制文件”)
endif(ARGC减去3)
数学(EXPR LAST_索引“${ARGC}-2”)
数学(EXPR DEST_索引“${ARGC}-1”)
集合(我的目的地${ARGV${DEST_INDEX}})
foreach(I范围1${LAST_INDEX})
消息(状态“${CMAKE_COMMAND}-E copy${ARGV${I}}${MY_DESTINATION}”)
添加自定义命令(目标${targetname}预生成命令${CMAKE_command}-E copy_,如果${ARGV${I}}${MY_DESTINATION})
endforeach(一)
endmacro(在生成时复制文件)
正如您所看到的,有一条调试消息,不幸的是,
${ARGV${I}}
${MY_DESTINATION}
(即
${ARGV${DEST_INDEX}}
)在打印时都是空的。因此,似乎不可能使用变量作为变量名的最后一部分来访问ARGV1、ARGV2等(请参阅)。现在,我将使用这些命令实现一个变通方法,但我的问题是:

如果必须跳过某些元素(例如第一个和最后一个),是否有更简单的方法在ARGV0、ARGV1、ARGV2元素上循环

编辑

遗憾的是,我发现甚至LIST命令都不能在ARGV上工作!但是如果我先创建一个ARGV副本,然后对其执行LIST命令,它们就可以工作。

${ARGV${DEST_INDEX}}}
在宏中不受支持(至少从我的经验来看)。必须执行
LIST(…)
操作,才能使用
${ARGV}
参数列表处理宏参数

使用以下任一选项:

  • LIST(REMOVE_AT,…)
    或类似的列表操作来删除参数或
  • 使用
    FOREACH(循环变量在…)进行迭代

这是我最终的实现,我愿意接受更好的解决方案
注意:如果某些目标目录不存在,第二个函数(也复制目录的函数)可能更安全

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)
    SET(ARGN_COPY ${ARGN})
    MATH(EXPR DEST_INDEX "${ARGC}-2") #It should be "${ARGC}-1", but we are using ARGN that doesn't contain the first element of the list
    list(GET ARGN_COPY ${DEST_INDEX} MY_DESTINATION)
    list(REMOVE_AT ARGN_COPY ${DEST_INDEX})
    foreach(MY_FILE ${ARGN_COPY})
#       message (STATUS "${CMAKE_COMMAND} -E copy_if_different ${MY_FILE} ${MY_DESTINATION}")
        add_custom_command(TARGET ${targetname} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MY_FILE} ${MY_DESTINATION})
    endforeach(MY_FILE)
endmacro(copy_files_at_build_time)
macro(在生成时复制文件targetname)#用法:在生成时复制文件([])
如果(ARGC减去3)
消息(错误“在生成时用少于3个参数调用复制文件”)
endif(ARGC减去3)
集合(ARGN_COPY${ARGN})
数学(EXPR DEST_INDEX“${ARGC}-2”)#它应该是“${ARGC}-1”,但我们使用的ARGN不包含列表的第一个元素
列表(获取ARGN\u COPY${DEST\u INDEX}MY\u DESTINATION)
列表(在ARGN\u COPY${DEST\u INDEX}处删除\u)
foreach(我的文件${ARGN\u COPY})
#消息(状态“${CMAKE_COMMAND}-E copy_if_不同${MY_FILE}${MY_DESTINATION}”)
添加自定义命令(目标${targetname}预生成命令${CMAKE_command}-E copy_,如果${MY_FILE}${MY_DESTINATION})
endforeach(我的文件)
endmacro(在生成时复制文件)
如果我们还想复制目录(注意:如果它是递归工作的,则不进行测试!)

macro(在生成时复制targetname)#用法:在生成时复制([])
如果(ARGC减去3)
消息(错误“在生成时用少于3个参数调用复制文件”)
endif(ARGC减去3)
集合(ARGN_COPY${ARGN})
数学(EXPR DEST_INDEX“${ARGC}-2”)#它应该是“${ARGC}-1”,但我们使用的ARGN不包含列表的第一个元素
列表(获取ARGN\u COPY${DEST\u INDEX}MY\u DESTINATION)
列表(在ARGN\u COPY${DEST\u INDEX}处删除\u)
foreach(我的文件${ARGN\u COPY})
获取\u文件名\u组件(叶\u名称“${MY\u FILE}”名称)
if(IS_目录${MY_文件})
添加自定义命令(目标${targetname}预生成命令${CMAKE_命令}-E copy_目录${MY_文件}${MY_目的地}/${LEAF_名称})
else(是_目录${MY_文件})
添加自定义命令(目标${targetname}预生成命令${CMAKE_command}-E copy_,如果${MY_FILE}${MY_DESTINATION}/${LEAF_NAME})
endif(是_目录${MY_文件})
endforeach(我的文件)
endmacro(在生成时复制)

我能看到的唯一一个小改进是定义了执行ARGV复制的e函数。这只会让代码更清晰一点。@GabrielPetrovay您是说只针对行
集(ARGN_COPY${ARGN})
?我不会用一个函数…我的意思是设置数学列表。当然,这取决于是否在更多宏中使用它。否则就没什么意义了。
macro   (copy_at_build_time targetname) #usage: copy_at_build_time(<targetname> <file|directory> [<files|directories>] <destination>)
    if(ARGC LESS 3)
        message(ERROR "copy_files_at_build_time called with less than 3 arguments")
    endif(ARGC LESS 3)
    SET(ARGN_COPY ${ARGN})
    MATH(EXPR DEST_INDEX "${ARGC}-2") #It should be "${ARGC}-1", but we are using ARGN that doesn't contain the first element of the list
    list(GET ARGN_COPY ${DEST_INDEX} MY_DESTINATION)
    list(REMOVE_AT ARGN_COPY ${DEST_INDEX})
    foreach(MY_FILE ${ARGN_COPY})
        get_filename_component(LEAF_NAME "${MY_FILE}" NAME)
        if (IS_DIRECTORY ${MY_FILE})
            add_custom_command(TARGET ${targetname} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_directory ${MY_FILE} ${MY_DESTINATION}/${LEAF_NAME})
        else(IS_DIRECTORY ${MY_FILE})
            add_custom_command(TARGET ${targetname} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different ${MY_FILE} ${MY_DESTINATION}/${LEAF_NAME})
        endif(IS_DIRECTORY ${MY_FILE})
    endforeach(MY_FILE)
endmacro(copy_at_build_time)