20

我正在尝试提供一些带有一些可执行文件的“源”文件。我想知道是否有办法将这些源文件复制到构建目录(从源目录),然后使用 CMake 复制到安装目录。

我更具体的目标是包含我在他们自己的 *.cl 文件中编写的 OpenCL 内核。

例子:

mkdir build
cd build
cmake ..
make

现在我的目录应该有一个可执行文件(标准 CMake)并且some_opencl_kernel.cl我在我的可执行文件中打开它。

4

2 回答 2

31

add_custom_command您可以通过添加以下内容将文件复制到构建树:

add_custom_command(TARGET MyExe POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_if_different
                       ${CMAKE_CURRENT_SOURCE_DIR}/src/some_opencl_kernel.cl
                       $<TARGET_FILE_DIR:MyExe>
                   )

这会将构建后事件添加到您的目标(我称之为它MyExe),它将文件复制src/some_opencl_kernel.cl到构建树中与可执行文件相同的目录中。

将文件复制到构建树中有多种其他方法,但我喜欢这种方法,因为它使用“生成器表达式”$<TARGET_FILE_DIR:MyExe>来标识可执行文件目录在构建树中的位置。这可能因构建类型或平台而异,因此生成器表达式是我认为指定此位置的最可靠、跨平台的方式。

至于安装,你可以使用install(FILES ...)命令。假设您的可执行文件具有以下内容:

install(TARGETS MyExe RUNTIME DESTINATION bin)

你可以添加:

install(FILES src/some_opencl_kernel.cl DESTINATION bin)

这会将其安装到${CMAKE_INSTALL_PREFIX}/bin/some_opencl_kernel.cl可执行文件旁边。

于 2013-03-29T01:40:20.883 回答
21

如果要复制包含某种类型文件的文件夹树:

  # Copy all assets to resources file
  INSTALL(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/assets/ DESTINATION ${INSTALL_PATH}/assets
          FILES_MATCHING PATTERN "*.dae"  PATTERN "*.jpg")

如果要复制文件夹中的所有文件,只需删除 FILES_MATCHING 模式。

于 2014-10-23T07:39:46.370 回答