簡體   English   中英

cmake:將文件復制到依賴目標(專門用於 OpenCL)

[英]cmake: Copy files to dependent targets (specifically for use in OpenCL)

我正在擺弄 OpenCL,文件通常在運行時編譯。 項目的典型結構如下所示:

foo/
  cl/foo.cl
  inc/foo.hpp
  src/foo.cpp
  CMakeLists.txt

其中foo.cpp將包含構建 OpenCL 內核的命令。 就像是:

buildKernelFromFile('cl/foo.cl'); // Note the relative path

為此,我一直在設置CMakeLists.txt文件以將.cl文件復制到二進制目錄中的cl/文件夾:

set(kernels
        foo.cl)
foreach (kernel IN ITEMS ${kernels})
    configure_file(${CMAKE_CURRENT_LIST_DIR}/cl/${kernel} ${CMAKE_CURRENT_BINARY_DIR}/cl/${kernel} COPYONLY)
endforeach ()

問題是當foo項目是可執行文件時,這種方法很好,因為.cl文件將被復制到與可執行文件相同的位置。 但是,當foo項目是一個庫時,這種方法不再有效,因為相對路徑是庫的二進制目錄,而不是使用該庫的可執行文件的二進制目錄。

所以我想要的是一種以某種方式告訴 CMake 將.cl文件復制到任何依賴目標的二進制目錄的方法。 具體來說,如果我像這樣構建 OpenCL 項目

add_library(foo foo.cpp)

然后在單獨的 CMakeLists.txt 文件中,鏈接到該項目:

add_executable(something main.cpp)
target_link_library(something PRIVATE foo)

我需要將我的.cl文件復制到something目標的構建文件夾CMAKE_CURRENT_BINARY_DIR

我想避免的一件事是必須將 .cl 文件保存為字符串文字,然后像包含一樣使用它們。 (如果它對您沒有意義,請忽略此評論)。

編輯:

同時,在 OpenCL 庫的 CMakeLists.txt 文件 ( foo/CMakeLists.txt ) 中,我簡單地聲明了一個函數

# Copy the OpenCL kernels to the build folder
set(KERNEL_DIR ${CMAKE_CURRENT_LIST_DIR}/cl PARENT_SCOPE)
function(copy_kernels)
    set(kernels
            foo.cl)
    foreach (kernel IN ITEMS ${kernels})
        configure_file(${KERNEL_DIR}/${kernel} ${CMAKE_CURRENT_BINARY_DIR}/cl/${kernel} COPYONLY)
    endforeach ()
endfunction()

應該由依賴項目調用。 然后在依賴項目中,除了鏈接到foo目標外,還需要調用這個函數

copy_kernels()
target_link_library(something PRIVATE foo) 

我想弄清楚如何擺脫那個copy_kernels()調用,但我對 cmake 的了解還不足以做到這一點。

令人沮喪的是,在 CMake 中沒有一種巧妙的方法可以做到這一點。 正如您所說, configure_file應該正是我們所需要的,但它沒有綁定到目標並且在配置時運行(因此每次內核更改時您都必須重新運行 cmake )。 我能夠管理的最好的是:

file(GLOB KERNELS cl/*.cl)
foreach(CurrentKernel IN LISTS KERNELS)
    add_custom_command(
                TARGET foo PRE_BUILD
                COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CurrentKernel} ${CMAKE_CURRENT_BINARY_DIR}/cl
                COMMENT "Copying kernel: ${CurrenKernel}")
endforeach()

暫無
暫無

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

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