NO_SYSTEM_FROM_IMPORTED
告诉我们IMPORTED
目标自动获得-isystem
。这是否也适用于使用 FetchContent 引入项目的目标?
如果不是(我假设是因为在获取的目标上有 clang-tidy 警告问题),获得此类目标的最佳方法是什么
-isystem
?
告诉我们NO_SYSTEM_FROM_IMPORTED
目标自动获得IMPORTED
。这是否也适用于使用 FetchContent 引入项目的目标?-isystem
不,因为
FetchContent
添加的目标本质上是由 add_subdirectory
添加的:它们成为生成的 buildystem 中 build(而不仅仅是 import)的目标。
如果不是(我假设是因为在获取的目标上有 clang-tidy 警告的问题),为此类目标获取 -isystem 的最佳方法是什么?
如果您使用的是 CMake 3.25 (
cmake_minimum_required(VERSION 3.25)
),您可以使用 SYSTEM
的
FetchContent_Declare
参数,它是由贡献者 daquexian 在 merge request #7399 中添加的。
对于 CPM 的用户,我已向 CPM 作者提请注意此更改here.
SYSTEM
目标属性,它是在merge request #7308(也是daquexian)中添加的。如果SYSTEM
是ON
,INTERFACE_INCLUDE_DIRECTORIES
将被视为系统包含目录。
如果您的
cmake_minimum_required(VERSION ...)
低于v3.25,那么使用这个其他答案。
实际上真的很容易(感谢@Tsyvarev):
include (FetchContent)
set (FETCHCONTENT_QUIET FALSE)
FetchContent_Declare (
Catch2
GIT_REPOSITORY https://github.com/catchorg/Catch2.git
GIT_TAG v2.4.2
GIT_PROGRESS TRUE
)
FetchContent_MakeAvailable (Catch2)
### here is what makes all include directories -isystem
get_target_property(CATCH2_IID Catch2 INTERFACE_INCLUDE_DIRECTORIES)
set_target_properties(Catch2 PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${CATCH2_IID}")