簡體   English   中英

如何使用主要CMakeLists.txt中的cmake復制目標文件?

[英]How to copy target files using cmake from major CMakeLists.txt?

作為示例,假設四個文件夾(app1,app2,app3和main)如下所示

main
|__ CMakeLists.txt
\__ module1
|______ CMakeLists.txt
|______ sub1.cpp
|______ sub1.h
\__ library5
|______ CMakeLists.txt
|______ sub5.cpp
|______ sub5.h
\__app1
\__app2
\__app3

其中module1的輸出是module1.dll,而library5的輸出是lib5.dll。 app1的文件夾必須包含module1.dll和lib5.dll,app2需要lib5.dll,最后app3需要module1.dll(應用程序,模塊和lib的數量超過此示例,正如我在下面解釋的那樣,我們不想更改模塊/庫的CMakeLists.txt ,只有main的CMakeLists.txt是我們的)。

PS:

我有一個cmake項目,其中包含幾個庫和模塊。 它們使用add_subdirectory命令包含在我的項目中(請注意,我的項目僅由多個模塊組成,並且沒有任何add_libraryadd_target )。

我需要復制的庫/輸出模塊, 無需改變自己CMakeLists.txtadd_custom_commandPOST_BUILD選項其實並不是一個很好的選擇,因為在這一點上我需要改變CMakeLists.txt庫/模塊, 他們不只是屬於我的項目 )。 另一方面,它必須在具有其他(庫/模塊)的外部(主要) CMakeLists.txt 完成

我嘗試了其他一些命令,例如file (COPY )configure_file()但是我認為它們在生成cmake-cache階段中起作用,並且可以復制預構建階段中存在的資源文件。

此外,在另一種方法中,我編寫了一個bash腳本文件來復制文件,然后通過bellow命令在主要的CMakeLists.txt調用它。

add_custom_target (copy_all
        COMMAND ${CMAKE_SOURCE_DIR}/copy.sh ${files}
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
)

這些files具有文件列表。 但是復制沒有執行! 我手動測試了可以正常工作的腳本。 但是我不知道為什么它不能在CMakeLists.txt中調用時運行。

如何將子項目輸出從主要CMakeLists.txt復制到某些位置?

設置

為了簡化一點,假設您有:

的CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(PostBuildCopyFromRoot)

add_subdirectory(module)

模塊/的CMakeLists.txt

file(WRITE "module.h" "int ModuleFunc();")
file(WRITE "module.cpp" "int ModuleFunc() { return 1; }")

add_library(module SHARED "module.cpp" "module.h")
target_include_directories(module PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}")
set_target_properties(module PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS 1)

應用程序/ app.mexw64

問題

如果現在將以下內容添加到根CMakeLists.txt

add_custom_command(
    TARGET module
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
        "$<TARGET_FILE:module>"
        "app/$<TARGET_FILE_NAME:module>"
)

您將從CMake獲得:

 CMake Warning (dev) at CMakeLists.txt:8 (add_custom_command): Policy CMP0040 is not set: The target in the TARGET signature of add_custom_command() must exist. Run "cmake --help-policy CMP0040" for policy details. Use the cmake_policy command to set the policy and suppress this warning. TARGET 'module' was not created in this directory. 

解決方案

您始終可以覆蓋命令行為:

    function(add_library _target)
        _add_library(${_target} ${ARGN})

        add_custom_command(
            TARGET ${_target}
            POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
                "$<TARGET_FILE:${_target}>"
                "${CMAKE_SOURCE_DIR}/app/$<TARGET_FILE_NAME:${_target}>"
        )
    endfunction()

注: 之前把代碼片段add_subdirectory()調用

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM