哪个CMake属性存储SYSTEM PRIVATE类型的包含目录?
CMake
target_include_directories 之 SYSTEM PRIVATE 场景解析 属性存储情况
官方文档仅明确SYSTEM搭配PUBLIC/INTERFACE时会填充INTERFACE_SYSTEM_INCLUDE_DIRECTORIES属性,但**SYSTEM PRIVATE指定的目录不会被存储到任何公开的CMake属性中**。原因在于PRIVATE作用域的目录仅作用于目标自身编译,无需传递给依赖项,因此CMake没有为这类目录设计专门的存储属性接口。
读取这些目录的方法
如果必须获取这些目录,可采用以下两种方案:
- 解析编译命令文件
开启CMAKE_EXPORT_COMPILE_COMMANDS选项,让CMake生成compile_commands.json文件。该文件记录了每个目标编译时的完整命令行,其中包含以-isystem开头的系统目录路径。你可以通过Python脚本、jq工具等解析这个JSON文件,提取对应目标的相关路径。 - 自定义属性存储
在调用target_include_directories的同时,手动将目录存入自定义的目标属性:
后续读取时使用# 定义要添加的系统私有目录 set(MY_PRIVATE_SYSTEM_DIRS "/path/to/include1" "/path/to/include2") # 添加为SYSTEM PRIVATE目录 target_include_directories(my_target SYSTEM PRIVATE ${MY_PRIVATE_SYSTEM_DIRS}) # 存入自定义属性 set_target_properties(my_target PROPERTIES PRIVATE_SYSTEM_INCLUDES "${MY_PRIVATE_SYSTEM_DIRS}")get_target_property:get_target_property(PRIVATE_SYSTEM_DIRS my_target PRIVATE_SYSTEM_INCLUDES)
额外说明
SYSTEM PRIVATE能正常工作(为GCC添加-isystem编译标志),是因为CMake内部会处理PRIVATE作用域的系统目录,将其转换为编译器对应的编译选项,但不会对外暴露存储这些目录的属性——毕竟PRIVATE目录本就仅属于目标自身,无需让其他逻辑访问。
内容的提问来源于stack exchange,提问作者Aleksandr Medvedev
相关产品推荐
相关产品推荐

