我正在尝试为 C++ 项目生成一个 CMake 目标,使用add_custom_target它将CMakeLists.txt驻留目录的内容复制到其中${CMAKE_BINARY_DIR},但不包括给定的文件列表。
虽然这看起来很容易,但我在这里遇到了问题。到目前为止我的尝试:
1)生成所有文件/目录的列表,删除要排除的项目并使用 CMake 复制命令:
file(GLOB files_to_copy LIST_DIRECTORIES TRUE *)
list(REMOVE_ITEM files_to_copy
${CMAKE_CURRENT_SOURCE_DIR}/file_to_exclude.txt
${CMAKE_CURRENT_SOURCE_DIR}/dir_to_exclude
# ...
)
add_custom_target(my-target
COMMAND ${CMAKE_COMMAND} -E copy ${files_to_copy} ${CMAKE_BINARY_DIR}
)
问题:
- 以这种方式删除项目适用于字符串比较级别,这可能会在使用符号链接时导致问题,例如
- 命令行
copy工具显然支持复制目录,但它似乎在我的机器上不起作用,因此目录不会被复制。
2)使用file命令复制文件,不包括部分文件
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/" DESTINATION ${CMAKE_BINARY_DIR}
PATTERN "file_to_exclude.txt" EXCLUDE
PATTERN "dir_to_exclude" EXCLUDE
)
问题:
- 这正是我想要的,除了命令没有绑定到目标,因此总是被执行。但我只需要将复制操作作为目标。
是否有可能将file(COPY ...)命令绑定到目标?或者任何其他直接的解决方案来实现我想要的?
请注意,我只想使用 CMake 内置工具,而不是执行任何特定于操作系统的 shell 命令(在跨平台项目上工作)。