我有以下项目布局:
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_lib
CMakeLists.txt
中的一个目标,它在构建时执行一个命令,将my_lib
中的所有标头复制到目标目录,同时保留目录结构。目的地目录将由project
CMakeLists.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_lib
0中的每个文件,删除最后一个正斜杠后面的任何内容,创建该目录,然后将文件复制到它上面。但我真的不想求助于此,也不想去想它,考虑到它必须在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_DIR
和COPY_DEST_DIR
是而不是转义的,这意味着cp.cmake
将包含其评估值。
注2:假设您的库创建了一个名为CMakeLists.txt
0的目标,并将add_custom_command
添加为该目标的POST_BUILD
事件。
最后,这里是关于add_custom_command、file命令和在脚本模式中运行cmake的cmake文档