CMake:用于复制与模式匹配的文件并保留目录结构的自定义命令



我有以下项目布局:

project/
├─ CMakeLists.txt
├─ main.cpp
╘═ my_lib/
├─ CMakeLists.txt
╞═ some_package1/
│  ├── header.hpp
│  └── impl.cpp
╘═ some_package2/
├── header.hpp
└── impl.cpp

CCD_ 1由CCD_ 2从CCD_ 3添加为子目录
我想要的是my_libCMakeLists.txt中的一个目标,它在构建时执行一个命令,将my_lib中的所有标头复制到目标目录,同时保留目录结构。目的地目录将由projectCMakeLists.txt定义。

基本上,如果我能以某种方式让add_custom_command做到这一点:

file(COPY ${CMAKE_SOURCE_DIR}/my_lib DESTINATION ${COPY_DEST_DIR} FILES_MATCHING PATTERN "*.hpp")

我会非常高兴。但我还没找到办法。这与安装目标非常相似,只是我需要在编译任何东西之前完成它。

我试着做以下事情:

set(MY_LIB_HEADER_FILES
some_package1/header.hpp
some_package2/header.hpp
)
add_custom_target(copy_headers)
add_custom_command(
TARGET copy_headers
COMMAND ${CMAKE_COMMAND} -E copy "${MY_LIB_HEADER_FILES}" ${COPY_DEST_DIR}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/my_lib
)

但这并不能保留目录结构,在本例中,这会导致一个标头被另一个标头覆盖。我一直没能找到解决办法。

我能想到的唯一解决方案是一种破解方法,在这种方法中,我循环遍历my_lib0中的每个文件,删除最后一个正斜杠后面的任何内容,创建该目录,然后将文件复制到它上面。但我真的不想求助于此,也不想去想它,考虑到它必须在add_custom_command调用中完成,我甚至不确定该怎么做。

肯定有解决办法,对吧?

实现这一点的方法之一是编写一个"CMake脚本";将包含file(COPY ....)命令的文件,并在add_custom_command中执行该命令。简而言之,您的代码片段如下所示:

#create script file during configure phase...
file(WRITE ${CMAKE_BINARY_DIR}/cp.cmake
"file(COPY ${CMAKE_SOURCE_DIR}/my_lib DESTINATION ${COPY_DEST_DIR} FILES_MATCHING PATTERN *.hpp)n"
)
#execute the script during the build phase...
add_custom_command(
TARGET my_lib
POST_BUILD
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_BINARY_DIR}/cp.cmake
)

file(WRITE ....语句将在名为cp.cmake的根构建文件夹中创建一个新的cmake脚本文件。

注1:$前面的变量CMAKE_SOURCE_DIRCOPY_DEST_DIR而不是转义的,这意味着cp.cmake将包含其评估值。

注2:假设您的库创建了一个名为CMakeLists.txt0的目标,并将add_custom_command添加为该目标的POST_BUILD事件。

最后,这里是关于add_custom_command、file命令和在脚本模式中运行cmake的cmake文档

最新更新