簡體   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