为何CMake install DIRECTORY命令安装空目录?如何仅装含匹配文件的目录?
解决CMake安装时仅保留含匹配文件目录的问题
针对你遇到的install(DIRECTORY)会复制不含.h文件的空目录问题,在CMake 3.22.1版本下可以用以下两种方法解决:
方法1:先筛选含目标文件的目录再安装
这种方法通用性最强,先递归找出所有包含.h文件的目录,再对这些目录执行安装操作,从根源上避免空目录被复制:
# 递归查找所有.h文件 file(GLOB_RECURSE HEADER_FILES "${CMAKE_BINARY_DIR}/*.h") # 提取每个头文件的所在目录并去重 set(TARGET_INSTALL_DIRS "") foreach(HEADER_PATH IN LISTS HEADER_FILES) get_filename_component(CURRENT_DIR "${HEADER_PATH}" DIRECTORY) list(APPEND TARGET_INSTALL_DIRS "${CURRENT_DIR}") endforeach() list(REMOVE_DUPLICATES TARGET_INSTALL_DIRS) # 安装筛选后的目录,仅保留.h文件 install(DIRECTORY ${TARGET_INSTALL_DIRS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} OPTIONAL FILES_MATCHING PATTERN "*.h" )
方法2:手动排除已知空目录(灵活性较差)
如果你的项目目录结构固定,明确知道哪些子目录不会包含.h文件,可以直接用PATTERN ... EXCLUDE排除这些目录:
install(DIRECTORY ${CMAKE_BINARY_DIR} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} OPTIONAL FILES_MATCHING PATTERN "*.h" # 示例:排除build和temp目录 PATTERN "build/*" EXCLUDE PATTERN "temp/*" EXCLUDE )
推荐优先使用方法1,它不需要提前知晓目录结构,能自动适配所有含.h文件的目录。
内容的提问来源于stack exchange,提问作者MBagher
相关产品推荐
相关产品推荐

