繁体   English   中英

cmake不会在自定义命令中复制文件

[英]cmake does not copy file in custom command

我想将qml文件从源目录复制到构建目录。 以下脚本第一次工作正常。 当我更改任何* .qml文件并运行make时,它们不会被复制到build文件夹,它们不会更新。 我究竟做错了什么?

file(GLOB_RECURSE SOURCES *.cpp)
file(GLOB_RECURSE QMLS *.qml)

add_library(MyLib SHARED ${SOURCES} ${QMLS})

foreach(QmlFile ${QMLS})
  add_custom_command(TARGET MyLib POST_BUILD
                     COMMAND ${CMAKE_COMMAND} -E copy_if_different
                     ${QmlFile} $<TARGET_FILE_DIR:MyLib>)
endforeach()

虽然Angew的答案很好,但可以消除额外目标的使用 为此, add_library调用应使用复制的 .qml文件(而不是原始文件,如问题帖子中的脚本):

# This part is same as in Angew's answer
set(copiedQmls "")
foreach(QmlFile ${QMLS})
  get_filename_component(nam ${QmlFile} NAME)
  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${nam}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QmlFile} ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS ${QmlFile}
    COMMENT "Copying ${QmlFile}"
    VERBATIM
  )
  list(APPEND copiedQmls ${CMAKE_CURRENT_BINARY_DIR}/${nam})
endforeach()

# But instead of creating new target, we reuse library one.
add_library(MyLib SHARED ${SOURCES} ${copiedQmls})

构建库目标时 ,它会触发add_library调用中的非源文件进行更新(如果存在相应的add_custom_command调用),但更新非源文件不会强制重建库文件 这就是您的原始代码无法按预期工作的原因。

注意,因为.qml文件不受CMake的为来源的认可,你并不需要设置GENERATED ,物业对他们的声明在这里

您正在使用add_custom_commandTARGET签名,这意味着命令在构建TARGET 在你的情况下, POST_BUILD ,这意味着命令将在MyLib的构建完成后运行。 如果MyLib是最新的并且不需要重新构建,则命令将不会运行。

您可能希望使用输出生成签名( OUTPUT )。 像这样的东西:

set(copiedQmls "")
foreach(QmlFile ${QMLS})
  get_filename_component(nam ${QmlFile} NAME)
  add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${nam}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${QmlFile} ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS ${QmlFile}
    COMMENT "Copying ${QmlFile}"
    VERBATIM
  )
  list(APPEND copiedQmls ${CMAKE_CURRENT_BINARY_DIR}/${nam})
endforeach()

add_custom_target(
  CopyQMLs ALL
  DEPENDS ${copiedQmls}
)

请注意,遗憾的是, add_custom_commandOUTPUT参数不支持生成器表达式,因此不能在那里使用$<TARGET_FILE_DIR> 我在上面的示例中使用了${CMAKE_CURRENT_BINARY_DIR} ,您可能需要根据自己的需要对其进行自定义。 ${CMAKE_CFG_INTDIR}可用于指定多配置生成器的每配置目录。

请注意我上面的代码中是否存在其他自定义目标。 这是必要的,因为如果某些东西依赖于该输出,CMake将只执行产生输出的自定义命令。 自定义命令通过列出其DEPENDS部分中的输出来执行DEPENDS

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM